我在Google周围搜索,找不到答案:
我有一个JFrame作为GUI并设置了一个componentListener
this.addComponentListener(new CL(this, logger));
在componentListener中,我具有componentResized等。
public void componentResized(ComponentEvent e) {
if (e.getSource() == gui) {
here I do the code
}
}
在Java 6下,一切工作正常,但是在Java 7下,正在调整Jframe的大小,但未重新绘制:未调用组件侦听器
我尝试了StackOverflow的一些替代方法,但没有办法使其工作。
当我最小化GUI窗口并还原它时,就会调用“ componentResized”。
任何人都知道发生了什么以及为什么它可以在Java 6而不是Java 7下工作。
这是一个示例代码:
public class Frame extends JFrame {
private JPanel panel;
public Frame() {
super();
getContentPane().setBounds(new Rectangle(0, 0, 200, 200));
getContentPane().setLayout(null);
getContentPane().add(getPanel());
this.addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
System.out.println("Window Resized: Frame");}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentHidden(ComponentEvent e) {}});
this.setSize(200, 200);
this.setPreferredSize(new Dimension(200, 200));
this.pack();
}
public JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.setBackground(Color.RED);
panel.setBounds(0, 0, 200, 200);
panel.setPreferredSize(new Dimension(200, 200));
}
return panel;
}
}
这是启动类:
public class StartUp {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
Frame app = new Frame();
app.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
app.pack();
app.setVisible(true);
}
}
在Java 6下运行时,您会收到“窗口大小调整:框架”消息。
在Java 7下运行相同,完全没有消息。
以下是2个指向图片的链接:
Java 6
Java 6 Frame Image
Java 7
Java 7 Frame Image
最佳答案
您的代码(在删除balast之前,已更改为标准)对我来说正常工作ComponentListener
从每个像素触发事件
这是componentResized()
的基本属性,否则需要SwingTimer.restart()
直到调整大小结束为止)
移除了爆炸,改为标准
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class MyFrame {
private JFrame frame = new JFrame();
private JPanel panel;
public MyFrame() {
frame.add(getPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
System.out.println("Window Resized: Frame");
}
});
}
public JPanel getPanel() {
if (panel == null) {
panel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
};
panel.setBackground(Color.RED);
}
return panel;
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MyFrame app = new MyFrame();
}
});
}
}