2016-04-03 24 views
2

Şu an 9x9 ızgara düğümü var ve bu düğmeler arasında onları ayırmak ve 3x3 ızgara yapmak için bazı çizgiler çizmek istiyorum.JFrame'de bir ızgara çizme

Başka bir pencerede bir JPanel yöntemimi denedim ve iyi çalışıyor, ancak hiçbir şey çizmediği için düğmelerimin yanında JFrame'de çalışamıyorum. Her bir düğme arasında zaten bir boşluk var, böylece varsa çizgiyi görebiliriz.

Gelecekteki yardımlarınız için çok teşekkürler. Eğer yapmaya çalıştığını olarak

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(); 
} 

}

cevap

4

JFrame doğrudan çizmek asla: Burada

kodudur. Ne yaptığınızı bilmiyorsanız, bu önemli bir risk taşır (örneğin, üst boya yöntemini çağırmıyorsunuz ve resim zincirini bu şekilde kırıyorsunuz) ve çekilen resimler görünmeyecek opak contentPane tarafından ele alınacaktır.

Çizim yapmanız gerekiyorsa, bunu JFrame içinde görüntülenen bir JPanel içinde yapın, ancak yine de aşağıdaki örnekte gördüğüm gibi, tek yapmanız gereken, bir ızgarada siyah düz çizgilerse çizmeye gerek yoktur.

Bir GridLayout kullanın ve düzeninize bazı boşluklar ayarlayın. GridLayout yapıcısının 3. ve 4. parametrelerinin boşlukları size vereceğini anlayın. O zaman alttaki JPanel'e bir Color.BLACK arka planını verin ve işte oraya gidin: çizgiler! JTextFields ile Örneğin:

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(); 
     }); 
    } 
} 

olarak görüntüleyen Hangi:

enter image description here

Ya JButtons ile:

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(); 
     }); 
    } 
} 

görüntüler:

enter image description here

+0

Anlatım için çok teşekkürler, şimdi anladım. – xZeasy

0

Ben kodunuzda bu minimal değişiklikler yapılmış,
- değişim yöntemi paintComponent ile paint ve öncelikle super.paintComponent yöntem vücutta
aramak - çerçevenin içeriği bölmede
olarak ayarlanmış panele - panele (çerçeveye değil)
için düğme eklemek - ve hat koordinat hesaplamalarını değiştirin.

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

Oh şimdi neyi yanlış yaptığımı anlıyorum, teşekkürler! – xZeasy