Кнопки не там, где я им говорю - PullRequest
0 голосов
/ 01 августа 2020

Итак, я пытался разместить 10 кнопок в сетке внизу моего фрейма (без использования диспетчера компоновки), и по какой-то причине я не могу понять, почему это не работает, мне было интересно, может ли кто-нибудь помочь.

Я, вероятно, должен объяснить код:

В основном я только что создал al oop, который хранит в нем «while», это while повторяется 3 раза перед тем, как закончить и вернуться к l oop. Через некоторое время Y изменится на 85, чтобы начать новый слой для следующих 3 кнопок. L oop повторяется 4 раза, чтобы создать 4 разных слоя из 10 кнопок.

Спасибо!

Main

public class Main {

    private static JFrame frame = new JFrame();
    private static JPanel panel = new JPanel();
    
    public static void main(String[] args) {
        Buttons.setButtons(frame, panel);
        Window.setFrame(frame, panel);
    }

}

Кнопки

public class Buttons {
    
    private static JButton b0, b1, b2, b3, b4, b5, b6, b7, b8, b9;
    private static JButton equals;
    private static JButton minus;
    private static JButton plus; 
    private static int i = 0;
    private static int x = 10;
    private static int y = 140;
    
    private static JButton buttons[] = {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9};
    
    public static void setButtons(JFrame frame, JPanel panel) {
        
        for (int b = 0; b < 4; b++) {
            while (i < 3) {
                buttons[i] = new JButton(Integer.toString(i)); 
                buttons[i].setBounds(x, y, 80, 80);
                x = x + 85; 
                buttons[i].setFocusable(false);
                buttons[i].setBackground(Color.GRAY);
                panel.add(buttons[i]);
                i++;
            }
            y = y + 85; 
            x = 10;
        }
        
        System.out.print(y);
        frame.setVisible(true); 
    }
    
}

Окно

public class Window {

    public static void setFrame(JFrame frame, JPanel panel) {
        
        frame.setSize(370, 525);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        
        panel.setBounds(10, 140, 200, 200);
        panel.setBackground(Color.DARK_GRAY); 
        frame.add(panel); 
    }
}

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Спасибо, это сработало и решило одну из моих проблем. Другая проблема заключалась в том, что «while» не работало после второго l oop, поэтому мне пришлось переписать систему l oop, вот решение на случай, если вы захотите его использовать (не используйте это, Я новичок. И не будь как я, воспользуйтесь менеджером по расположению.):

public class Buttons {

private static JButton b0, b1, b2, b3, b4, b5, b6, b7, b8, b9;
private static JButton dot;
private static JButton equals;
private static JButton minus;
private static JButton plus;
private static int count = 9;
private static int x = 10;
private static int y = 145;

private static JButton buttons[] = {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9};

public static void setButtons(JFrame frame, JPanel panel) {
    
    for (int b = 3; b > 0; b--) {
        for (int i = 3; i > 0 ; i--) {
        buttons[count] = new JButton(Integer.toString(count)); 
        buttons[count].setBounds(x, y, 80, 80);
        x = x + 85; 
        buttons[count].setFocusable(false);
        buttons[count].setBackground(Color.GRAY);
        panel.add(buttons[count]);
        count--;
        }
        y = y + 85; 
        x = 10;
    }
    
    dot = new JButton(".");
    dot.setBounds(x, y, 80, 80);
    dot.setFocusable(false);
    dot.setBackground(new Color(0, 200, 150));
    panel.add(dot);
    
    buttons[0] = new JButton("0");
    x = x + 85;
    buttons[0].setBounds(x, y, 80, 80);
    buttons[0].setFocusable(false);
    buttons[0].setBackground(Color.GRAY);
    panel.add(buttons[0]);
    
    plus = new JButton("+");
    x = x + 85; 
    plus.setBounds(x, y, 80, 80); 
    plus.setFocusable(false);
    plus.setBackground(new Color(0, 200, 150));
    panel.add(plus);
    
    minus = new JButton("-");
    x = x + 85;
    minus.setBounds(x, y, 80, 80);
    minus.setFocusable(false);
    minus.setBackground(new Color(0, 200, 150));
    panel.add(minus); 
    
    equals = new JButton("=");
    y = 145;
    equals.setBounds(x, y, 80, 250);
    equals.setFocusable(false);
    equals.setBackground(new Color(240, 150, 50));
    panel.add(equals); 
    
    frame.setVisible(true); 
}

}

0 голосов
/ 01 августа 2020

Может быть, вы думаете, что вы работаете без менеджера компоновки, потому что вы не вызывали setLayout на своем JFrame, но на самом деле JFrame дал себе BorderLayout по умолчанию .

Если вы действительно хотите работать без менеджера компоновки, добавьте строку

frame.setLayout(null);

в свой код настройки.

...