2016-04-03 18 views
2

今は9x9グリッドのボタンがあります。それらのボタンの間にいくつかの線を描き、3x3グリッドにしたいと思います。JFrameにグリッドを描く

別のウィンドウでJPanelでメソッドを試してみましたが、正常に動作しますが、何も描画しないので、ボタンの横にあるJFrameで機能しません。 各ボタンの間には既にスペースがありますので、そこに行があるかどうかを確認できます。

今後のお役に立てせていただきありがとうございます。ここで

はコードです:

import javax.swing.*; 
import java.awt.*; 

public class ButtonGrid extends JPanel{ 

JFrame frame=new JFrame(); 
int t = 9; 

public ButtonGrid(){ //constructor 
    frame.setLayout(new GridLayout(t, t, 3, 3)); 
    addButtons(frame, t); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 

} 

@Override public void paint(Graphics g) { 
    g.setColor(getBackground()); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.setColor(Color.BLACK); 
    for (int i = 0; i <= 9; i++) { 
     if (i % 3 == 0) { 
      int coord = i * 58; 
      coord++; 
      g.drawLine(coord, 0, coord, 58*9); 
      g.drawLine(0, coord, 58*9, coord); 
     } 
    } 
} 

private void addButtons(JFrame frame, int t){ 
    JButton grid; 
    for(int y=0; y<t; y++){ 
     for(int x=0; x<t; x++){ 
      grid=new JButton(x+","+y); //creates new button 
      grid.setPreferredSize(new Dimension(55,55)); 
      frame.add(grid); //adds button to grid 

     } 
    } 
} 

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

}

答えて

4

あなたがやろうとしているようJFrameの上に直接描画することはありません。これは、あなたが何をしているのかわからない場合(例えば、スーパーのペイントメソッドを呼び出さず、誤ってペイントチェーンをこのように壊しているなど)、描画された画像は表示されません不透明なcontentPaneで覆われます。

JPanelで描画する必要がある場合は、JFrame内に表示されますが、下の例のように、グリッド内に黒い直線があれば描画する必要はありません。

GridLayoutを使用してレイアウトにギャップを設定します。 GridLayoutコンストラクタの3番目と4番目のパラメータがギャップを与えることを理解してください。次に、基底のJPanelにColor.BLACKバックグラウンドを与えます。 JTextFieldと例えば:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class SudokuMCVE extends JPanel { 
    private static final int CLUSTER = 3; 
    private static final int MAX_ROWS = 9; 
    private static final float FIELD_PTS = 32f; 
    private static final int GAP = 3; 
    private static final Color BG = Color.BLACK; 
    private static final Color SOLVED_BG = Color.LIGHT_GRAY; 
    public static final int TIMER_DELAY = 2 * 1000; 
    private JTextField[][] fieldGrid = new JTextField[MAX_ROWS][MAX_ROWS]; 

    public SudokuMCVE() { 
     JPanel mainPanel = new JPanel(new GridLayout(CLUSTER, CLUSTER)); 
     mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     mainPanel.setBackground(BG); 
     JPanel[][] panels = new JPanel[CLUSTER][CLUSTER]; 
     for (int i = 0; i < panels.length; i++) { 
      for (int j = 0; j < panels[i].length; j++) { 
       panels[i][j] = new JPanel(new GridLayout(CLUSTER, CLUSTER, 1, 1)); 
       panels[i][j].setBackground(BG); 
       panels[i][j].setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
       mainPanel.add(panels[i][j]); 
      } 
     } 

     for (int row = 0; row < fieldGrid.length; row++) { 
      for (int col = 0; col < fieldGrid[row].length; col++) { 
       fieldGrid[row][col] = createField(row, col); 
       int i = row/3; 
       int j = col/3; 
       panels[i][j].add(fieldGrid[row][col]); 
      } 
     } 

     setLayout(new BorderLayout()); 
     add(mainPanel, BorderLayout.CENTER); 
     add(new JButton(new SolveAction("Solve")), BorderLayout.PAGE_END); 
    } 

    private JTextField createField(int row, int col) { 
     JTextField field = new JTextField(2); 
     field.setHorizontalAlignment(JTextField.CENTER); 
     field.setFont(field.getFont().deriveFont(Font.BOLD, FIELD_PTS)); 

     return field; 
    } 

    private class SolveAction extends AbstractAction { 

     public SolveAction(String name) { 
      super(name); 
      int mnemonic = (int) name.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Timer(TIMER_DELAY, new ActionListener() { 
       private int i = 0; 
       private int j = 0; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        // MAX_ROWS is 9 
        if (i == MAX_ROWS) { 
         ((Timer) e.getSource()).stop(); 
        } 
        if (j == MAX_ROWS) { 
         i++; 
         j = 0; 
        } 
        int number = (int) (MAX_ROWS * Math.random()) + 1; 
        fieldGrid[i][j].setBackground(SOLVED_BG); 
        fieldGrid[i][j].setText(String.valueOf(number)); 

        j++; 
       } 
      }).start(); 
     } 
    } 

    private static void createAndShowGui() { 
     SudokuMCVE mainPanel = new SudokuMCVE(); 

     JFrame frame = new JFrame("SudokuMCVE"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 

はのように表示する:

enter image description here

またはJButtonがで:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class JPanelGrid extends JPanel { 
    private static final int SML_SIDE = 3; 
    private static final int SIDE = SML_SIDE * SML_SIDE; 
    private static final int GAP = 3; 
    private static final Color BG = Color.BLACK; 
    private static final Dimension BTN_PREF_SIZE = new Dimension(80, 80); 
    private JButton[][] buttons = new JButton[SIDE][SIDE]; 

    public JPanelGrid() { 
     setBackground(BG); 
     setLayout(new GridLayout(SML_SIDE, SML_SIDE, GAP, GAP)); 
     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     JPanel[][] smallPanels = new JPanel[SML_SIDE][SML_SIDE]; 
     for (int i = 0; i < smallPanels.length; i++) { 
      for (int j = 0; j < smallPanels[i].length; j++) { 
       smallPanels[i][j] = new JPanel(new GridLayout(SML_SIDE, SML_SIDE)); 
       add(smallPanels[i][j]); 
      } 
     } 
     for (int i = 0; i < buttons.length; i++) { 
      int panelI = i/SML_SIDE; 
      for (int j = 0; j < buttons[i].length; j++) { 
       int panelJ = j/SML_SIDE; 
       String text = String.format("[%d, %d]", j, i); 
       buttons[i][j] = new JButton(text); 
       buttons[i][j].setPreferredSize(BTN_PREF_SIZE); 
       smallPanels[panelI][panelJ].add(buttons[i][j]); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     JPanelGrid mainPanel = new JPanelGrid(); 

     JFrame frame = new JFrame("JPanelGrid"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 

表示されます。

enter image description here

+0

説明をいただきありがとうございます。 – xZeasy

0

私は
、あなたのコードでこれらの最小限の変更をした - paintComponentと変更方法paintとメソッド本体
に、まずsuper.paintComponentを呼び出す - フレームのコンテンツ区画
として設定パネル -
(フレームにはない)パネルにボタンを追加 - ライン座標の計算を変更する

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ButtonGrid extends JPanel { 

    JFrame frame = new JFrame(); 
    int t = 9; 

    public ButtonGrid() { // constructor 
     frame.setContentPane(this); 
     setLayout(new GridLayout(t, t, 3, 3)); 
     addButtons(t); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
//  g.setColor(getBackground()); 
//  g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.RED); 
     for (int i = 0; i <= 9; i++) { 
      if (i % 3 == 0) { 
       int coordx = getWidth() * i/9; 
       int coordy = getHeight() * i/9; 
       g.drawLine(coordx, 0, coordx, getHeight()); 
       g.drawLine(0, coordy, getWidth(), coordy); 
      } 
     } 
    } 

    private void addButtons(int t) { 
     JButton grid; 
     for (int y = 0; y < t; y++) { 
      for (int x = 0; x < t; x++) { 
       grid = new JButton(x + "," + y); // creates new button 
       grid.setPreferredSize(new Dimension(55, 55)); 
       add(grid); // adds button to grid 

      } 
     } 
    } 

    public static void main(String[] args) { 
     new ButtonGrid(); 
    } 
} 
+0

ああ、私はここで間違っていたことを理解しています、ありがとう! – xZeasy

関連する問題