Java Swing-针对特定任务的最佳控件

Java Swing-针对特定任务的最佳控件,java,swing,Java,Swing,我需要将JavaSwing窗口划分为许多字段,类似于桌子或棋盘。每个单元格的颜色应取决于该单元格所代表的对象(每个对象都有坐标,坐标在游戏过程中不断变化,因此每个单元格的颜色不是恒定的) 此外,如果用户单击空白字段(白色),则会创建一个新的随机对象,并将此对象指定给这些字段(并且字段颜色正在更改) 哪种java swing控件最适合这些功能?如果我是你,我会创建两个面板类(白色和黑色),白色的一个带有鼠标指针,这样当单击其中一个面板时,你可以从数组中随机拉出JLabel。下面是一个可能有用的示例

我需要将JavaSwing窗口划分为许多字段,类似于桌子或棋盘。每个单元格的颜色应取决于该单元格所代表的对象(每个对象都有坐标,坐标在游戏过程中不断变化,因此每个单元格的颜色不是恒定的)

此外,如果用户单击空白字段(白色),则会创建一个新的随机对象,并将此对象指定给这些字段(并且字段颜色正在更改)


哪种java swing控件最适合这些功能?

如果我是你,我会创建两个
面板
类(白色和黑色),白色的一个带有
鼠标指针
,这样当单击其中一个面板时,你可以从数组中随机拉出
JLabel
。下面是一个可能有用的示例(大约120行):

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.Random;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
公共类草稿纸扩展了JFrame{
私有静态最终长serialVersionUID=1L;
私有静态最终int GRIDSIZE=8;
private JPanel[][]whitePanel=新的whitePanel[GRIDSIZE][GRIDSIZE];
private JPanel[][]blackPanel=新blackPanel[GRIDSIZE][GRIDSIZE];
private Random rand=new Random();
JButton b1=新JButton(“Btn1”);
JButton b2=新JButton(“Btn2”);
JButton b3=新JButton(“Btn3”);
JLabel l1=新的JLabel(“Lbl1”);
JLabel l2=新的JLabel(“Lbl2”);
JLabel l3=新的JLabel(“Lbl3”);
JPanel面板=新的JPanel();
私有JComponent[]randObjects={{b1,b2,b3},{l1,l2,l3},{panel,panel,panel};
私有颜色[]randColors={Color.RED,Color.ORANGE,Color.YELLOW,Color.GREEN,Color.BLUE,Color.MAGENTA};
公共草稿{
initGUI();
setTitle(“示例”);
包装();
setLocationRelativeTo(空);
可设置大小(假);
setDefaultCloseOperation(关闭时退出);
setVisible(真);
}
私有void initGUI(){
JPanel centerPanel=新的JPanel();
setLayout(新的GridLayout(GRIDSIZE,GRIDSIZE));//生成8*8网格
添加(中心面板,BorderLayout.CENTER);
MouseAdapter ma=新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
组件clickedComp=findComponentAt(e.getPoint());
JPanel目标=(JPanel)点击comp;
面板背景(randColors[rand.nextInt(randColors.length)];
if(白色面板的目标实例){
target.add(randObjects[rand.nextInt(randObjects.length)][rand.nextInt(randObjects[0].length)];
target.updateUI();
}
}
};
addMouseListener(硕士);

对于(int row=0;row)具有背景色和图标的JLabel二维数组。
JTable
。。。。。。。?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;


public class ScratchPaper extends JFrame {
    private static final long serialVersionUID = 1L;
    private static final int GRIDSIZE = 8;
    private JPanel[][] whitePanel = new WhitePanel[GRIDSIZE][GRIDSIZE];
    private JPanel[][] blackPanel = new BlackPanel[GRIDSIZE][GRIDSIZE];
    private Random rand = new Random();
    JButton b1 = new JButton("Btn1");
    JButton b2 = new JButton("Btn2");
    JButton b3 = new JButton("Btn3"); 
    JLabel l1 = new JLabel("Lbl1");
    JLabel l2 = new JLabel("Lbl2");
    JLabel l3 = new JLabel("Lbl3");
    JPanel panel = new JPanel();

    private JComponent[][] randObjects = {{b1, b2, b3}, {l1, l2, l3}, {panel, panel, panel}};
    private Color[] randColors = {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA};


    public ScratchPaper() {
        initGUI();
        setTitle("EXAMPLE");
        pack();
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void initGUI() {
        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(GRIDSIZE, GRIDSIZE)); // makes 8*8 grid
        add(centerPanel, BorderLayout.CENTER);

        MouseAdapter ma = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Component clickedComp = findComponentAt(e.getPoint());
                JPanel target = (JPanel) clickedComp;
                panel.setBackground(randColors[rand.nextInt(randColors.length)]);

                if (target instanceof WhitePanel){
                    target.add(randObjects[rand.nextInt(randObjects.length)][rand.nextInt(randObjects[0].length)]); 
                    target.updateUI();
                }
            }
        };
        addMouseListener(ma);

         for (int row=0; row<GRIDSIZE; row++) {
            for (int col=0; col<GRIDSIZE; col++) {
                whitePanel[row][col] = new WhitePanel(row, col);
                blackPanel[row][col] = new BlackPanel(row, col);

                if ((row%2 == 0 && col%2 == 0) || ((row+1)%2 == 0 && (col+1)%2 == 0)) {
                    centerPanel.add(whitePanel[row][col]);
                } 
                else {
                    centerPanel.add(blackPanel[row][col]);
                }
            }
         }
    }


    public static void main(String args[]) {
        try {
            String className = UIManager.getCrossPlatformLookAndFeelClassName();
            UIManager.setLookAndFeel(className);
        } catch (Exception ex) {
            System.out.println(ex);
        }

        EventQueue.invokeLater(new Runnable(){
            @Override
            public void run(){
                new ScratchPaper();
            }
        });
    }

    class WhitePanel extends JPanel {   
        private static final int SIZE = 50;

        public WhitePanel(int row, int col) {
            Dimension size = new Dimension(SIZE, SIZE);
            setPreferredSize(size);
            setBackground(Color.WHITE);
        }
    }

    class BlackPanel extends JPanel {
        private static final int SIZE = 50;

        public BlackPanel(int row, int col) {
            Dimension size = new Dimension(SIZE, SIZE);
            setPreferredSize(size);
            setBackground(Color.BLACK);
        }
    }
}