paint () не работает после добавления панели и рамки - PullRequest
1 голос
/ 24 февраля 2020

Я делаю вид моей краски, которая создает фигуры, она работала нормально, пока я не добавил слои (панель и рамку), теперь фигуры не видны при нажатии кнопки. Я предполагаю, что это под слоями? Я попытался использовать paintComponent и revalidate et c и все еще не мог заставить его появиться

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main2 extends JPanel implements ActionListener {

    private static Square mySquare;
    private static Circle myCircle;
    private static Color myColor;
    public boolean SquareCheck;
    public boolean CircleCheck;
    JButton buttonSquare;
    JButton buttonCircle;
    JFrame frame;
    JPanel panel;

    public void paint(Graphics g) {
        if (SquareCheck) {
            g.setColor(myColor);
            g.fillRect(mySquare.x, mySquare.y, mySquare.width, mySquare.length);
        } else if (CircleCheck) {
            g.setColor(myColor);
            g.fillOval(myCircle.x, myCircle.y, myCircle.width, myCircle.length);
        }
    }

    public void start() {
        frame = new JFrame();
        panel = new JPanel();

        //setLayout(new BorderLayout());

        buttonSquare = new JButton("■");
        buttonCircle = new JButton("●");

        buttonSquare.setPreferredSize(new Dimension(200, 20));
        buttonCircle.setPreferredSize(new Dimension(200, 20));

        buttonCircle.addActionListener(this);
        buttonSquare.addActionListener(this);
        //add(buttonCircle, BorderLayout.NORTH);
        //add(buttonSquare, BorderLayout.SOUTH);
        JToggleButton red = new JToggleButton();
        panel.add(buttonCircle);
        panel.add(buttonSquare);
        frame.add(panel);
        frame.setSize(500, 500);
        frame.setVisible(true);

    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == buttonSquare) {
            SquareCheck = true;
        } else if (e.getSource() == buttonCircle) {
            CircleCheck = true;
        }
        repaint();

    }
    public static void main(String[] args) {
        mySquare = new Square(30, 50, 50, 50);
        myCircle = new Circle(60, 100, 50, 50);
        myColor = Color.red;
        Main2 x = new Main2();
        x.start();

    }
}

В основном кнопки изменяют логическое значение, затем вызывается перерисовка и на основе логического значения это dr aws или cirlce или квадрат , код работал до добавления рамки и панели

1 Ответ

1 голос
/ 24 февраля 2020

Ваш метод рисования является методом класса Main2, но вы никогда не добавляете экземпляр Main2 в JFrame или любой компонент, который входит в JFrame, и поэтому экземпляр Main2 никогда не будет отображаться, а менеджер рисования Swing будет никогда не вызывайте метод рисования.

Для начала, избавьтесь от этой переменной, panel = new JPanel(); и от каждого места, где вы используете panel, замените this. Таким образом, вы будете работать с правильным экземпляром Main2 и добавлять его к GUI.

Другие проблемы:

  • Вам необходимо вызвать эквивалентный метод рисования супер в вашем переопределить в своей первой строке
  • Переопределить paintComponent, а не рисовать и вызвать yes. В этом переопределении
  • Вы захотите изучить и использовать Java соглашения об именах, Имена переменных должны начинаться со строчной буквы, а имена классов - с заглавной. Изучение этого и последующее позволит нам лучше понять ваш код и позволит вам лучше понять код других.
  • В целях безопасности добавьте аннотацию @Override над любым методом, который вы Подумайте, может переопределять родительский метод (например, рисование), чтобы убедиться, что вы делаете это правильно.

Например:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

@SuppressWarnings("serial")
public class Main2 extends JPanel implements ActionListener {

    private static Square mySquare;
    private static Circle myCircle;
    private static Color myColor;
    private JToggleButton buttonSquare;
    private JToggleButton buttonCircle;
    JFrame frame;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (buttonSquare.isSelected()) {
            g.setColor(myColor);
            g.fillRect(mySquare.x, mySquare.y, mySquare.width, mySquare.length);
        } 
        if (buttonCircle.isSelected()) {
            g.setColor(myColor);
            g.fillOval(myCircle.x, myCircle.y, myCircle.width, myCircle.length);
        }
    }

    public Main2() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        buttonSquare = new JToggleButton("■");
        buttonCircle = new JToggleButton("●");

        buttonCircle.addActionListener(this);
        buttonSquare.addActionListener(this);

        this.add(buttonCircle);
        this.add(buttonSquare);
        frame.add(this);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        repaint();
    }

    public static void main(String[] args) {
        mySquare = new Square(30, 50, 50, 50);
        myCircle = new Circle(60, 100, 50, 50);
        myColor = Color.red;
        new Main2();
    }
}

class MyShape {
    public int x, y, width, length;

    public MyShape(int x, int y, int width, int length) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.length = length;
    }

}
...