Die Pfeiltasten sollen nur die markierten Felder auf dem TilePanel bewegen.
Meinst Du in etwa so ?
Auf das Textfeld klicken und die Größe eingeben. Nach dem Enter wird das Quadrat auf die gewünschte Größe gesetzt und kann mit den Pfeiltasten bewegt werden.
Zum Testen kannst Du die jar herunterladen.
[CODE lang="java" title="StartMoveArea" highlight="10"]import javax.swing.JFrame;
public class StartMoveArea {
public static void main(String[] args) {
MoveSquarePanel panel = new MoveSquarePanel(600, 600);
JFrame frame = new JFrame("Arrows move Square, entered value resize square");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.setResizable(false);
frame.getContentPane().addKeyListener(panel.getKeyBoard());
frame.pack();
frame.setVisible(true);
frame.getContentPane().requestFocus();
}
}[/CODE]
[CODE lang="java" title="MoveSquarePanel" highlight="19-21,27-43"]import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MoveSquarePanel extends JPanel {
private NumberInput input;
private Square square = new Square();
public MoveSquarePanel(int width, int height) {
setPreferredSize(new Dimension(width, height));
input = new NumberInput(1);
input.setPreferredSize(new Dimension(width / 12, input.getFont().getSize() * 2));
add(input);
input.setIntInputListener(value -> {
square.setDim(value);
getParent().requestFocusInWindow();
repaint();
});
square.setPos(100, 100);
setBackground(Color.DARK_GRAY);
}
public KeyAdapter getKeyBoard() {
return new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP)
square.moveUp();
if (key == KeyEvent.VK_LEFT)
square.moveLeft();
if (key == KeyEvent.VK_RIGHT)
square.moveRight();
if (key == KeyEvent.VK_DOWN)
square.moveDown();
repaint();
}
};
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
square.draw(g);
}
}[/CODE]
[CODE lang="java" title="Square"]import java.awt.Color;
import java.awt.Graphics;
public class Square {
private int x;
private int y;
private int scale = 20;
private int dim = 1;
private Color color = Color.RED;
public void draw(Graphics g) {
g.setColor(color);
g.fillRect(x, y, getSize(), getSize());
}
public int getSize() {
return scale * dim;
}
public void moveDown() {
y += scale;
}
public void moveLeft() {
x -= scale;
}
public void moveRight() {
x += scale;
}
public void moveUp() {
y -= scale;
}
public void setDim(int dim) {
this.dim = dim;
}
public void setScale(int scale) {
this.scale = scale;
}
public void setPos(int x, int y) {
this.x = x;
this.y = y;
}
}[/CODE]
[CODE lang="java" title="NumberInput" highlight="13,7"]import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class NumberInput extends JTextField {
private IntInputListener listener; // listener is called after ActionEvent
public NumberInput(int value) {
setDocument(new IntDocument(2)); // allow only integer up to 99.
addActionListener(e -> {
if (listener != null)
listener.valueEntered(Integer.parseInt(getText()));
});
setText(value + "");
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
selectAll();
}
});
}
public void setIntInputListener(IntInputListener listener) {
this.listener = listener;
}
}[/CODE]
[CODE lang="java" title="IntDocument"]import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
@SuppressWarnings("serial")
public class IntDocument extends PlainDocument {
public static final int NO_LIMIT = 0;
private int maxSize = NO_LIMIT;
public IntDocument(int maxSize) {
this.maxSize = maxSize;
}
@Override
public void insertString(final int offset, String text, final AttributeSet attributeSet)
throws BadLocationException {
text = text.replaceAll(".*[^0-9]", ""); // remove all non digits
if (isNewLengthOk(text))
super.insertString(offset, text, attributeSet);
}
protected boolean isNewLengthOk(final String text) {
return maxSize == NO_LIMIT || getLength() + text.length() <= maxSize;
}
/**
* Limits input to given length.
*
* @param maxSize
*/
public void setMaxSize(int maxSize) {
if (maxSize < 1)
return;
this.maxSize = maxSize;
}
}[/CODE]
[CODE lang="java" title="IntInputListener"]public interface IntInputListener {
public void valueEntered(int value);
}
[/CODE]