我遇到一个问题,如果按下“c”键,我只需要重绘/重建绘图区域。 我正在使用repaint()的方式,结果是绘制区域的位置。 我还注意到,每当我重新调整框架大小时,keylistener就不再有效了。
问题:
喜欢附上显示器,但似乎因为我是新手而受阻。
以下代码是调用“newZone”类的主要函数。
frame.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e){
System.out.println("component Rebuild");
frame.getContentPane().removeAll();
frame.getContentPane().invalidate();
JComponent newContentPane = new newZone(frame.getSize());
newContentPane.setOpaque(true);
frame.getContentPane().add(newContentPane);
frame.getContentPane().revalidate();
frame.setContentPane(newContentPane);
}
});
以下是newZone类,其中包含Paint&的KeyListener:
public class newZone extends JComponent implements MouseListener, MouseMotionListener, KeyListener {
JPanel panel1;
JTextArea textArea;
JScrollPane scrollPane;
MyDrawingTool Drawing;
static int firsttimer = 0;
static int preposX = 0;
static int preposY = 0;
static int widthPercentage = 80 , heightPercentage = 93;
static int numberOfYboxes,numberOfXboxes;
static Dimension currentPanelSize;
static final String NEWLINE = System.getProperty("line.separator");
static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
public newZone(Dimension currentPanelSize1) {
currentPanelSize = currentPanelSize1;
Drawing = new MyDrawingTool();
Drawing.setBackground(Color.WHITE);
Drawing.setBounds( 10, 10,
(int) currentPanelSize.getWidth()*(widthPercentage)/100,
(int) currentPanelSize.getHeight()*(heightPercentage)/100 );
Drawing.setPreferredSize(new Dimension( (int) currentPanelSize.getWidth()*(widthPercentage)/100,
(int) currentPanelSize.getHeight()*(heightPercentage)/100));
Drawing.addMouseListener(this);
Drawing.addMouseMotionListener(this);
add(Drawing);
addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e){
System.out.println( "Key type: "+e.getKeyChar());
if(e.getKeyChar() == 'c'){
Drawing.redraw();
}
}
});
setFocusable(true);
}
class MyDrawingTool extends JPanel{
void redraw(){
repaint();
}
@Override
public void paint(Graphics q){
//super.paint(q);
int j,k, width, height;
int startX = 10, startY = 10;
int boxSize = 50;
width = (int)currentPanelSize.getWidth()*(widthPercentage)/100;
height = (int)currentPanelSize.getHeight()*(heightPercentage)/100;
numberOfYboxes = (height-20)/50;
numberOfXboxes = (width-20)/50;
for ( j = 0; j < numberOfYboxes; j++)
{
startX = 10;
for ( k = 0; k < numberOfXboxes; k++)
{
q.setColor(Color.WHITE);
q.fillRect(startX, startY, boxSize, boxSize);
q.setColor(Color.BLUE); //Set line color
q.drawRect(startX, startY, boxSize, boxSize);
startX+=boxSize;
}
startY+=boxSize;
}
}
}
}
答案 0 :(得分:2)
我不知道你为什么使用ComponentListener。我没有看到任何理由删除/添加/ invalidate / revalidat并执行所有其他操作。
您需要做的就是将面板添加到框架内容窗格的CENTER中。随着框架调整大小,面板将自动增大/减小尺寸。不需要ComponentListener。
自定义绘画应该在paintComponent()方法中完成,不要忘记在开始时调用super.paintComponent(...)。
KeyListener不起作用,因为在调整帧大小后焦点现在位于JFrame(而不是面板)上。你不应该为此使用KeyListener。相反,即使面板没有焦点,你也应该Key Bindings。
答案 1 :(得分:0)
看来,您根本不需要切换内容窗格。 如果您在默认内容窗格上使用某些布局,如@camickr建议的那样,您将无需手动处理调整大小和其他内容。 祝你好运。