我在将图片添加到JFrame时遇到了问题,有些东西缺失可疑或写错了。 这是课程:
主要课程:
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);
}
}
请你帮忙,有什么问题? 感谢
顺便说一句:我正在使用eclipse,图像假设在哪个目录?
答案 0 :(得分:3)
您发布的代码有几个问题:
getContentPane().add()
课程中使用add()
而不是BorderLayoutFrame
。SwingUtilities.invokeLater()
从测试人员类启动JFrame。这样的事情: 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);
}
});
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'是打字机吗?在PicPanel.PaintComponent()
中,您不需要所有宽度/高度的东西,只需这样做:
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
并且避免一起调用super.paintComponent,因为你正在绘制一个图像,为什么你想让面板完全绘制?
我的最终实现:
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);
}
}
答案 1 :(得分:2)
在Eclipse中,如果您使用路径"table.jpg"
,那么您需要将该图像放在项目的顶层。
有关Eclipse项目结构的更多信息,请参阅this Stack Overflow question.
您可能想尝试使用ImageIcon
来显示图像,而不是在面板上绘制图像。
以下代码将创建一个ImageIcon
,您只需添加到JPanel
。
ImageIcon pic = new ImageIcon(getClass().getResource("myimage.jpeg");
这使用一种奇特的方式来加载pic,以便在放入Jar文件时它可以正常工作。