Java JPanel I'的混淆性质;我想用
我正在用swing构建一个简单的GUI,但我遇到了一个无法找出原因的问题。创建缓冲映像会阻止代码的其余部分执行任何操作Java JPanel I'的混淆性质;我想用,java,swing,jframe,jpanel,javax.imageio,Java,Swing,Jframe,Jpanel,Javax.imageio,我正在用swing构建一个简单的GUI,但我遇到了一个无法找出原因的问题。创建缓冲映像会阻止代码的其余部分执行任何操作 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.BorderFactory; import java.awt.image.BufferedImage; import jav
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.BorderFactory;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Main extends JPanel{
BufferedImage img;
int number;
public static void main(String[] args) {
JFrame frame = new JFrame("Some practice");
frame.setSize(200,200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Main doStuff = new Main();
JButton myButton = new JButton("Button");
JPanel controls = new JPanel();
controls.setBorder(BorderFactory.createTitledBorder(
"Small Panel"));
controls.add(myButton);
frame.add("South", controls);
frame.add(doStuff);
}
public Main () {
super.setBorder(BorderFactory.createTitledBorder("Big Panel!"));
// This method seems to shut down my GUI
importImage();
}
private void importImage() {
try {
img = ImageIO.read(new File("res/strawberry.jpg"));
} catch (IOException e) {
System.out.println("Image exception");
}
}
}
如果在Main
的构造函数中有我的importImage
函数,则GUI不会显示。尝试注释掉行doStuff()代码>将显示两个带边框的面板
我想知道的是,Java或Swing的哪些特性导致了这种混乱?谢谢Moveframe.setVisible(true)
到main()
的末尾
然后将构造函数更改为使用add(ImagePanel)
like
String imgPath = "res/strawberry.jpg";
add(new ImagePanel(imgPath));
最后,您应该在一个新的线程
上下文中进行操作,我在Main
中添加了一个ActionListener
,这样您就可以单击该按钮了。把它们放在一起
public class Main extends JPanel implements ActionListener {
BufferedImage img;
int number;
public static void main(String[] args) {
JFrame frame = new JFrame("Some practice");
Runnable doRun = new Runnable() {
@Override
public void run() {
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Main doStuff = new Main();
JButton myButton = new JButton("Button");
myButton.addActionListener(doStuff);
JPanel controls = new JPanel();
controls.setBorder(BorderFactory
.createTitledBorder("Small Panel"));
controls.add(myButton);
frame.add("South", controls);
frame.add(doStuff);
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(doRun);
}
public Main() {
super.setBorder(BorderFactory.createTitledBorder("Big Panel!"));
final String imgPath = "res/strawberry.jpg";
// This method seems to shut down my GUI
add(new ImagePanel(imgPath));
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e);
}
}
图像有多大?80x80。增加帧大小似乎没有帮助。哇,那ImagePanel
是垃圾代码!我数了至少8行,让我觉得作者应该回去学习基础知识。如果您计算缺少的super.paintComponent(g),则为9代码>呼叫。
String imgPath = "res/strawberry.jpg";
add(new ImagePanel(imgPath));
public class Main extends JPanel implements ActionListener {
BufferedImage img;
int number;
public static void main(String[] args) {
JFrame frame = new JFrame("Some practice");
Runnable doRun = new Runnable() {
@Override
public void run() {
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Main doStuff = new Main();
JButton myButton = new JButton("Button");
myButton.addActionListener(doStuff);
JPanel controls = new JPanel();
controls.setBorder(BorderFactory
.createTitledBorder("Small Panel"));
controls.add(myButton);
frame.add("South", controls);
frame.add(doStuff);
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(doRun);
}
public Main() {
super.setBorder(BorderFactory.createTitledBorder("Big Panel!"));
final String imgPath = "res/strawberry.jpg";
// This method seems to shut down my GUI
add(new ImagePanel(imgPath));
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e);
}
}