如何使用列和行标签创建这种类似于网格的布局? [英] How to create this grid-like layout with column and row labels?
问题描述
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]
推荐答案
很多事情都取决于您要实现的目标,例如,您可以使用GridLayout
,GridBagLayout
或布局管理器的组合或者您可以使用自定义绘画,也可以使用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屋!