【问题标题】:How to paint on a Jpanel?如何在 Jpanel 上绘画?
【发布时间】:2014-02-03 00:04:49
【问题描述】:

我正在尝试在一个框架中添加 2 个不同的面板。一个面板在框架中添加了几个按钮。其他框架将在框架中添加一个棋盘。我很困惑,如何在面板上绘制此板。我的 Frame 顶部有一块板,底部有按钮。此外,如果我在给定的代码中出现错误,请告诉我有人可以帮助我吗?我的代码是

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    private JFrame main;
    private JPanel board;
    private JPanel buttons;
    private JButton add;
    private JButton delete;

    public Test()
    {
        main=new JFrame();
        board=new JPanel();
        buttons=new JPanel();
        add=new JButton("Add");
        delete=new JButton("Delete");
        init();
        addButtons();
    }
    public void init()
    {
        main.setSize(700,700);
        main.setVisible(true);
        main.setDefaultCloseOperation(main.EXIT_ON_CLOSE);
    }
    public void addButtons()
    {
        buttons.setSize(700,40);
        buttons.setLayout(new FlowLayout());
        buttons.add(add);
        buttons.add(delete);
        main.add(buttons,BorderLayout.SOUTH);

    }
    public void addBoxes()
    {
        // what should be my code here...??
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Test();

    }
}

【问题讨论】:

标签: java eclipse swing jpanel paintcomponent


【解决方案1】:
  1. 您需要一个可在其上绘制的组件,例如 JPanel
  2. 你需要@Override它的paintComponent方法
  3. 您可以使用循环使用Graphics 上下文进行绘制
  4. 使用标志在颜色之间交替。

看看一些Painting Graphics tutorials

同时,试一试

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Board extends JPanel {

    private static final int DIM_WIDTH = 640;
    private static final int DIM_HEIGHT = 640;
    private static final int SQ_SIZE = 80;

    boolean black = true;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < DIM_HEIGHT; i += SQ_SIZE) {
            if (black) {
                black = false;
            } else {
                black = true;
            }
            for (int j = 0; j < DIM_WIDTH; j += SQ_SIZE) {
                if (black) {
                    g.setColor(Color.WHITE);
                    g.fillRect(j, i, SQ_SIZE, SQ_SIZE);
                    black = false;
                } else {
                    g.setColor(Color.BLACK);
                    g.fillRect(j, i, SQ_SIZE, SQ_SIZE);
                    black = true;
                }
            }
        }
    }

    public static void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.add(new Board());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);

    }

    public Dimension getPreferredSize() {
        return new Dimension(DIM_WIDTH, DIM_HEIGHT);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

【讨论】:

  • 如果我必须在我的棋盘下方添加另一个带有两个按钮的面板怎么办?
  • 取出main方法和createAndshowGui方法。那么这个类只是一个普通的面板。您可以添加您自己班级的JFrame。然后只需在其下方添加一个单独的面板,带有按钮。
  • 这也可以通过使用 GridLayout 和 JPanel 来实现,这将降低管理的复杂性,并且更容易为example板上放置棋子
  • 你能解释一下这些语句的作用吗? frame.setLocationByPlatform(true); frame.pack();
  • .pack() 只是将框架中组件的首选尺寸保持为最小尺寸,.setLocationbyPlatform() 只是设置框架的位置。您也可以将其设置为null 以使其居中。您也可能想查看@MadProgrammer 链接。他的想法似乎更合理。
猜你喜欢
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多