如何使用列和行标签创建这种类似于网格的布局? [英] How to create this grid-like layout with column and row labels?

查看:63
本文介绍了如何使用列和行标签创建这种类似于网格的布局?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class BattleShip {

    private static ImageIcon image1 = new ImageIcon("cols.png"); 
    private static ImageIcon image2 = new ImageIcon("rows.png");
    private static JMenuBar menubar = new JMenuBar();
    private static JPanel container = new JPanel();
    private static JButton[][] button = new JButton[10][10];
    private static JFrame frame = new JFrame("BattleShip");
    private static JButton open;

    public static void fileMenu() {

        JMenu fileMenu = new JMenu("File");

        JMenuItem open = new JMenuItem("Open");
        open.setMnemonic(KeyEvent.VK_O);
        open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));

        JMenuItem restartGame = new JMenuItem("Restart Game");
        restartGame.setMnemonic(KeyEvent.VK_R);
        restartGame.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK));

        JMenuItem exit = new JMenuItem("Exit");
        exit.setMnemonic(KeyEvent.VK_E);
        exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK));

        open.addActionListener(new OpenMenu());
        exit.addActionListener(new ExitMenu()); 

        fileMenu.add(open);
        fileMenu.add(restartGame);
        fileMenu.add(exit);

        menubar.add(fileMenu);

    }

    public static void layout() {


        JPanel panelOne = new JPanel();
        JPanel panelTwo = new JPanel();

        JPanel playerPanel = new JPanel();
        JPanel cpuPanel = new JPanel();

        panelOne.add(playerPanel, BorderLayout.CENTER);

        panelOne.setLayout(new BorderLayout());
        panelTwo.setLayout(new BorderLayout());

        panelOne.add(new JLabel(image1), BorderLayout.NORTH);
        panelTwo.add(new JLabel(image1), BorderLayout.NORTH);

        panelOne.add(new JLabel(image2), BorderLayout.WEST);
        panelTwo.add(new JLabel(image2), BorderLayout.WEST);




        panelOne.add(playerPanel, BorderLayout.CENTER);


        container.setLayout(new GridLayout(1,2));
        container.add(panelOne);
        container.add(panelTwo);        
    }

    public static void FlowLayout() {

        JPanel panel = new JPanel();
        JPanel panel1 = new JPanel();

        JPanel playerSide = new JPanel();

        panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));



        JLabel cols = new JLabel();
        cols.setIcon(image1);
        JLabel rows = new JLabel();
        rows.setIcon(image2);


        panel.add(cols);


    }


    public static void main(String[] args) {

        fileMenu();
        layout();








        frame.add(container);
        frame.setJMenuBar(menubar); 

        frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static class ExitMenu implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }

    }
    private static class OpenMenu implements ActionListener {

        public void actionPerformed(ActionEvent e) {


        }
    }
    private static class SelectFile implements ActionListener {

        public void actionPerformed(ActionEvent event) {
            if (event.getSource() == open) {


            }
        }
    }
}

如何使用行和列作为图片进行这种布局? 对于cols,我将如何做空白并将两者结合在一起并制成网格?没有其他问题向我展示如何进行此布局?

How can I do this layout with the rows and cols as a picture? For the cols how would i do the white space and combine the two together and make a grid? None of the other questions shows me how to do this layout?

[![在此处输入图片描述] [1]] [1]

[![enter image description here][1]][1]

推荐答案

很多事情都取决于您要实现的目标,例如,您可以使用GridLayoutGridBagLayout或布局管理器的组合或者您可以使用自定义绘画,也可以使用JTable例如...

A lot will come down to what it is you want to achieve, for example you could use a GridLayout, GridBagLayout or a combination of layout managers or you could use custom painting or you could use a JTable for example...

现在,这是非常基本的,仅用于提供概念证明

Now, this is pretty basic and is only intended to provide a proof of concept

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        public MainPane() {
            setLayout(new BorderLayout());
            DefaultTableModel model = new DefaultTableModel(10, 10);
            JTable table = new JTable(model);
            table.setRowHeight(40);
            table.setShowGrid(true);
            table.setGridColor(Color.BLACK);

            JScrollPane sp = new JScrollPane(table);
            sp.setRowHeaderView(new RowHeader(table));
            add(sp);
        }

    }

    public class RowHeader extends JPanel {

        private JTable table;

        public RowHeader(JTable table) {
            setOpaque(false);
            this.table = table;
            table.getModel().addTableModelListener(new TableModelListener() {
                @Override
                public void tableChanged(TableModelEvent e) {
                    prepareLayout();
                }
            });
            setLayout(new GridBagLayout());
            prepareLayout();
        }

        protected void prepareLayout() {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.anchor = GridBagConstraints.CENTER;
            Border border = new MatteBorder(0, 1, 1, 1, Color.BLACK);
            for (int row = 0; row < 10; row++) {
                char value = (char) ('A' + row);
                JLabel label = makeLabel(Character.toString(value));
                label.setBorder(border);
                add(label, gbc);
            }
            gbc.weighty = 1;
            JLabel filler = makeLabel("");
            filler.setBorder(new MatteBorder(1, 0, 0, 0, Color.BLACK));
            add(filler, gbc);
        }

        protected JLabel makeLabel(String text) {
            JLabel label = new JLabel(text) {
                @Override
                public Dimension getPreferredSize() {
                    Dimension size = super.getPreferredSize();
                    size.height = table.getRowHeight();
                    size.width += 10;
                    return size;
                }
            };
            label.setHorizontalAlignment(JLabel.CENTER);
            return label;
        }
    }

}

这篇关于如何使用列和行标签创建这种类似于网格的布局?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆