1

私は Swing を初めて使用し、次の形式のテーブルを作成したいと考えています。

ここに画像の説明を入力

では、表のようにセルを分割する方法は? 役に立つリンクやチュートリアル、アイデアはありますか?

4

1 に答える 1

4

これはボウリングのスコアカードのように見えます。その前提に基づいて、列の数は固定され、エントリの数は 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;
  }
}
于 2013-03-08T17:01:42.357 に答える