向JFrame添加图像时出现问题 [英] problem in adding image to JFrame
问题描述
我在向JFrame添加图片时遇到问题,缺少探测器或写入错误。
这里是类:
I'm having problems in adding a picture into JFrame, something is missing probebly or written wrong. here are the classes:
主类:
public class Tester
{
public static void main(String args[])
{
BorderLayoutFrame borderLayoutFrame = new BorderLayoutFrame();
borderLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
borderLayoutFrame.setSize(600,600);
borderLayoutFrame.setVisible(true);
}
}
public class BorderLayoutFrame extends JFrame implements ActionListener
{
private JButton buttons[]; // array of buttons to hide portions
private final String names[] = { "North", "South", "East", "West", "Center" };
private BorderLayout layout; // borderlayout object
private PicPanel picture = new PicPanel();
// set up GUI and event handling
public BorderLayoutFrame()
{
super( "Philosofic Problem" );
layout = new BorderLayout( 5, 5 ); // 5 pixel gaps
setLayout( layout ); // set frame layout
buttons = new JButton[ names.length ]; // set size of array
// create JButtons and register listeners for them
for ( int count = 0; count < names.length; count++ )
{
buttons[ count ] = new JButton( names[ count ] );
buttons[ count ].addActionListener( this );
}
add( buttons[ 0 ], BorderLayout.NORTH ); // add button to north
add( buttons[ 1 ], BorderLayout.SOUTH ); // add button to south
add( buttons[ 2 ], BorderLayout.EAST ); // add button to east
add( buttons[ 3 ], BorderLayout.WEST ); // add button to west
add( picture, BorderLayout.CENTER ); // add button to center
}
// handle button events
public void actionPerformed( ActionEvent event )
{
}
}
我试图将图像添加到
这里是图像类:
public class PicPanel extends JPanel
{
Image img;
private int width = 0;
private int height = 0;
public PicPanel()
{
super();
img = Toolkit.getDefaultToolkit().getImage("table.jpg");
}
public void paintComponent(Graphics g)
{
super.paintComponents(g);
if ((width <= 0) || (height <= 0))
{
width = img.getWidth(this);
height = img.getHeight(this);
}
g.drawImage(img,0,0,width,height,this);
}
}
请你帮忙,有什么问题?
谢谢
Please your help, what is the problem? thanks
BTW:我正在使用eclipse,该图像假定为哪个目录?
BTW: i'm using eclipse, which directory the image suppose to be in?
推荐答案
您发布的代码有几个问题:
There's several issues with the code you've posted:
- 您应该使用
getContentPane()。add()
而不是简单的add()
在你的BorderLayoutFrame
class。 - 您应该真正使用
SwingUtilities.invokeLater()
从测试员类启动JFrame。这样的:
- You should use
getContentPane().add()
instead of simplyadd()
in yourBorderLayoutFrame
class. - You should really use
SwingUtilities.invokeLater()
to launch your JFrame from the tester class. Something like this:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.setProperty("DEBUG_UI", "true");
BorderLayoutFrame blf = new BorderLayoutFrame();
blf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
blf.setSize(600,600);
blf.setVisible(true);
}
});
- 不要使用Toolkit加载图片!在下面的代码中,如果Table.jpg与PicPanel在同一个包中,图像将正确加载。
public PicPanel() {
super();
try {
rUrl = getClass().getResource("Table.jpg");
if (rUrl != null) {
img = ImageIO.read(rUrl);
}
} catch (IOException ex) {
Logger.getLogger(PicPanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
- 在
PicPanel.PaintComponent()
你调用super.paintComponents()
是's'a typeo? -
在
PicPanel.PaintComponent()
中,您不要需要所有宽度/高度的东西,只需执行以下操作:- In
PicPanel.PaintComponent()
you callsuper.paintComponents()
is the 's' a typeo? In
PicPanel.PaintComponent()
, you don't need all the width/height stuff, just do this:g.drawImage(img,0,0,getWidth(),getHeight(),this);
/ p>
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
避免将super.paintComponent调用在一起,因为您正在绘制图像,为什么要面板要完全绘制?
And avoid the call to super.paintComponent all together because you're painting an image, why do you want the panel to paint at all?
我的最终实现你的东西:
My final implementation of your stuff:
public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { System.setProperty("DEBUG_UI", "true"); BorderLayoutFrame blf = new BorderLayoutFrame(); blf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); blf.setSize(600,600); blf.setVisible(true); } }); } } class BorderLayoutFrame extends JFrame implements ActionListener { private final BorderLayout layout; private final JButton[] buttons; private final String names[] = {"North", "South", "East", "West", "Center"}; public BorderLayoutFrame() { super( "Philosofic Problem" ); layout = new BorderLayout( 5, 5 ); getContentPane().setLayout( layout ); buttons = new JButton[ names.length ]; for (int i=0; i<names.length; i++) { buttons[i] = new JButton(names[i]); buttons[i].addActionListener(this); } getContentPane().add(buttons[0], BorderLayout.NORTH); getContentPane().add(buttons[1], BorderLayout.SOUTH); getContentPane().add(buttons[2], BorderLayout.EAST); getContentPane().add(buttons[3], BorderLayout.WEST); getContentPane().add(new PicPanel(), BorderLayout.CENTER); } public void actionPerformed(ActionEvent e) { // ignore } } class PicPanel extends JPanel { private URL rUrl; private BufferedImage img; public PicPanel() { super(); try { rUrl = getClass().getResource("UtilBtn.png"); if (rUrl != null) { img = ImageIO.read(rUrl); } } catch (IOException ex) { Logger.getLogger(PicPanel.class.getName()).log(Level.SEVERE, null, ex); } } @Override protected void paintComponent(Graphics g) { //super.paintComponent(g); g.drawImage(img, 0, 0, getWidth(), getHeight(), this); } }
这篇关于向JFrame添加图像时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- In