Java JTable分裂细胞。如何

Java JTable分裂细胞。如何,java,swing,jtable,Java,Swing,Jtable,我是Swing新手,我想创建一个具有以下表单的表: 那么,如何像表中所示那样拆分单元格呢? 你有什么有用的链接、教程或想法吗?我觉得这就像一张保龄球记分卡。基于这个假设,列的数量是固定的,条目的数量往往是6个或更少。因为您可能不需要滚动,所以我建议使用固定的组件网格而不是JTable 这可以通过使用GridBagLayout轻松实现。对于名称,我将使用JTextArea。对于每帧的2个计分单元,我将使用JTextFields。对于保存框架分数的底部2列跨度组件,我可能会使用JLabel 将所有这

我是Swing新手,我想创建一个具有以下表单的表:

那么,如何像表中所示那样拆分单元格呢?
你有什么有用的链接、教程或想法吗?

我觉得这就像一张保龄球记分卡。基于这个假设,列的数量是固定的,条目的数量往往是6个或更少。因为您可能不需要滚动,所以我建议使用固定的组件网格而不是JTable

这可以通过使用GridBagLayout轻松实现。对于名称,我将使用JTextArea。对于每帧的2个计分单元,我将使用JTextFields。对于保存框架分数的底部2列跨度组件,我可能会使用JLabel

将所有这些放在一个JPanel上,然后为每个投球手重新创建面板

编辑: 这里有一个快速的模型来展示这个概念。不一定在视觉上很漂亮,但我将留给读者作为练习:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class BowlingScoreCard implements Runnable
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new BowlingScoreCard());
  }

  public void run()
  {
    JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(createScorecard(4), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
  }

  private JPanel createScorecard(int numPlayers)
  {
    JPanel p = new JPanel(new GridBagLayout());

    p.add(new JLabel("Player"), gbc(0, 0, 1, 1));
    for (int x = 1; x <= 10; x++)
    {
      p.add(new JLabel(Integer.toString(x)), gbc(x, 0, 1, 1));
    }

    for (int y = 1; y <= numPlayers; y++)
    {
      JTextArea textArea = new JTextArea(2, 10);
      p.add(textArea, gbc(0, y, 1, 1));

      for (int i = 1; i <= 9; i++)
      {
        p.add(createFrame(2), gbc(i, y, 1, 1));
      }

      p.add(createFrame(3), gbc(10, y, 1, 1));
    }

    return p;
  }

  private JPanel createFrame(int entries)
  {
    JLabel label = new JLabel(" ");
    label.setBackground(Color.GRAY);

    JPanel p = new JPanel(new GridBagLayout());
    p.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
    for (int i = 0; i < entries; i++)
    {
      p.add(new JTextField(3), gbc(i, 0, 1, 1));
    }
    p.add(label, gbc(0, 1, 2, 1));
    return p;
  }

  private GridBagConstraints gbc(int x, int y, int colspan, int rowspan)
  {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = colspan;
    gbc.gridheight = rowspan;
    gbc.weightx = 0;
    gbc.weighty = 0;
    gbc.anchor = GridBagConstraints.CENTER;
    gbc.fill = GridBagConstraints.NONE;
    return gbc;
  }
}

我觉得这像是保龄球记分卡。基于这个假设,列的数量是固定的,条目的数量往往是6个或更少。因为您可能不需要滚动,所以我建议使用固定的组件网格而不是JTable

这可以通过使用GridBagLayout轻松实现。对于名称,我将使用JTextArea。对于每帧的2个计分单元,我将使用JTextFields。对于保存框架分数的底部2列跨度组件,我可能会使用JLabel

将所有这些放在一个JPanel上,然后为每个投球手重新创建面板

编辑: 这里有一个快速的模型来展示这个概念。不一定在视觉上很漂亮,但我将留给读者作为练习:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class BowlingScoreCard implements Runnable
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new BowlingScoreCard());
  }

  public void run()
  {
    JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(createScorecard(4), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
  }

  private JPanel createScorecard(int numPlayers)
  {
    JPanel p = new JPanel(new GridBagLayout());

    p.add(new JLabel("Player"), gbc(0, 0, 1, 1));
    for (int x = 1; x <= 10; x++)
    {
      p.add(new JLabel(Integer.toString(x)), gbc(x, 0, 1, 1));
    }

    for (int y = 1; y <= numPlayers; y++)
    {
      JTextArea textArea = new JTextArea(2, 10);
      p.add(textArea, gbc(0, y, 1, 1));

      for (int i = 1; i <= 9; i++)
      {
        p.add(createFrame(2), gbc(i, y, 1, 1));
      }

      p.add(createFrame(3), gbc(10, y, 1, 1));
    }

    return p;
  }

  private JPanel createFrame(int entries)
  {
    JLabel label = new JLabel(" ");
    label.setBackground(Color.GRAY);

    JPanel p = new JPanel(new GridBagLayout());
    p.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
    for (int i = 0; i < entries; i++)
    {
      p.add(new JTextField(3), gbc(i, 0, 1, 1));
    }
    p.add(label, gbc(0, 1, 2, 1));
    return p;
  }

  private GridBagConstraints gbc(int x, int y, int colspan, int rowspan)
  {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = colspan;
    gbc.gridheight = rowspan;
    gbc.weightx = 0;
    gbc.weighty = 0;
    gbc.anchor = GridBagConstraints.CENTER;
    gbc.fill = GridBagConstraints.NONE;
    return gbc;
  }
}

你有任何有用的链接、教程或想法吗?我的想法是“只使用表格数据”。由于这不是明确的“表格数据”,请使用不同的组件或组件组。顺便问一下,这是不是代表10针保龄球的记分卡?看看@MadProgrammer,这很有用,谢谢you@AndrewThompson是的,这就是我的意思,我想显示每一帧球员的得分。@MadProgrammer:我不能决定哪些球员是受人尊敬的还是过时的。阿米拉格:另请看。你有任何有用的链接、教程或想法吗?我的想法是“只使用表格数据”。由于这不是明确的“表格数据”,请使用不同的组件或组件组。顺便问一下,这是不是代表10针保龄球的记分卡?看看@MadProgrammer,这很有用,谢谢you@AndrewThompson是的,这就是我的意思,我想显示每一帧球员的得分。@MadProgrammer:我不能决定哪些球员是受人尊敬的还是过时的。阿米拉格:另见。