Java JFrame Graphics不会出现

时间:2015-03-29 18:44:35

标签: java graphics jframe

public class FrameTest extends JFrame {

    private JPanel contentPane;
    private JPanel spielPane;
    private JPanel infoPane;
    private JButton btnStart;
    private JLabel lblRunde;
    private Monster monster1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameTest frame = new FrameTest();
                    frame.setVisible(true);
                    Monster m = new Monster();
                    frame.repaintSpielPanel();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public FrameTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        setContentPane(contentPane);

        spielPane = new JPanel();
        spielPane.setBounds(6, 6, 566, 566);
        spielPane.setLayout(null);
        spielPane.setBackground(Color.yellow);
        contentPane.add(spielPane);

        infoPane = new JPanel();
        infoPane.setBounds(578, 6, 216, 566);
        infoPane.setLayout(null);
        infoPane.setBackground(Color.yellow);
        contentPane.add(infoPane);

        btnStart = new JButton("Start");
        btnStart.setBounds(44, 6, 117, 29);
        infoPane.add(btnStart);

        lblRunde = new JLabel("Runde");
        lblRunde.setBounds(77, 47, 61, 16);
        infoPane.add(lblRunde);

        monster1 = new Monster();
        monster1.setVisible(true);
        spielPane.add(monster1);
    }

    private class Monser extends JLabel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(0, 0, 10, 10);
        }
    }

    public void repaintSpielPanel() {
        spielPane.repaint();
    }
}

我试图将一个矩形放入我的框架中,但它不在那里。我刚刚开始编程,所以可能我只是不知道如何将它放到屏幕上。请帮助!

1 个答案:

答案 0 :(得分:1)

  1. 不要在不透明的JLabel中画画。而是在JPanel中这样做。
  2. 不要使用空布局和setBounds(...)。虽然null布局和setBounds()似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,你在使用它们时会遇到更严重的困难。 。当GUI调整大小时,他们不会调整组件的大小,他们是增强或维护的皇家女巫,当他们放置在滚动窗口时他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。
  3. 最重要的是,你永远不会在这里添加你的绘图组件的实例,Monser。要确定这是真的,请在代码中搜索对new Monser()的任何调用。如果没有调用构造函数,则不会创建实例。
  4. 另请注意,您正在创建一个Monster实例,这是一个您未向我们展示的课程。
  5. 您正在使用JPanel将其添加到null布局,因此它没有大小,因此根本不会显示。同样,不要使用空布局。

  6. 例如:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class MyTest extends JPanel {
       private static final Color BG = Color.yellow;
       private static final int GAP = 8;
       private JButton btnStart = new JButton("Start");
       private JLabel lblRunde = new JLabel("Runde", SwingConstants.CENTER);
       private MonsterPanel monsterPanel = new MonsterPanel(600, 600, BG);
    
       public MyTest() {
          JPanel buttonPanel = createButtonPanel();
          buttonPanel.setBackground(BG);
    
    
          setLayout(new BorderLayout(GAP, GAP));
          setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
          add(monsterPanel, BorderLayout.CENTER);
          add(buttonPanel, BorderLayout.LINE_END);
       }
    
       private JPanel createButtonPanel() {
          JPanel btnPanel = new JPanel();
          btnPanel.setBackground(BG);
    
          JPanel gridPanel = new JPanel(new GridLayout(0, 1, 0, 5));
          gridPanel.setOpaque(false);
          gridPanel.add(btnStart);
          gridPanel.add(lblRunde);
    
          btnPanel.add(gridPanel);
          return btnPanel;
       }
    
       private static void createAndShowGui() {
          MyTest mainPanel = new MyTest();
    
          JFrame frame = new JFrame("MyFrameTest");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    class MonsterPanel extends JPanel {
       public static final int MONST_WIDTH = 10;
       public static final Color MONST_COLOR = Color.red;
       private int prefW;
       private int prefH;
       private int monstX = 0;
       private int monstY = 0;
    
       public MonsterPanel(int prefW, int prefH, Color bkgrnd) {
          this.prefW = prefW;
          this.prefH = prefH;
          setBackground(bkgrnd);
       }
    
       public void setMonstXY(int x, int y) {
          this.monstX = x;
          this.monstY = y;
          repaint();
       }
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          g.setColor(MONST_COLOR);
          g.fillRect(monstX, monstY, MONST_WIDTH, MONST_WIDTH);
       }
    
       @Override
       public Dimension getPreferredSize() {
          if (isPreferredSizeSet()) {
             return super.getPreferredSize();
          }
          return new Dimension(prefW, prefH);
       }
    }