Не рисуются фигуры на JFrame(JPanel) при Layout(null)

214
05 мая 2018, 17:49

Нужно, чтобы на одном JFrame отображались кнопки и фигуры(стрелки/линии). Для расположения кнопок задаю layout null, но при этом не отрисовываются элементы из метода paintComponent. Если layout по умолчанию, то линия отрисовывается, но расползается расположение кнопок, как мне не надо. Как отрисовать фигуру(линию, в частности) при layout null ? Цель: реализация подобного алгоритма https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm

public class Check extends JPanel {
public Check() {
}
public void draw(){
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setLayout(null); // ??????
    frame.add(this);
    frame.setSize(600,600);
    frame.setVisible(true);
}
@Override
public void paintComponent(Graphics g){
    super.paintComponents(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.drawLine(10,10,500,500);
}
public static void main(String[] args) {
    Check inst = new Check();
    inst.draw();
}
}
Answer 1

Вам нужно немного изменить подход, а именно разбить панель для отрисовки компонентов и графики на несколько. В примере ниже:

    import javax.swing.*;
    import java.awt.*;
    public class Check {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.add(new MyButtonPanel(), BorderLayout.NORTH);
                frame.add(new MyDrawPanel(), BorderLayout.CENTER);
                frame.setSize(600, 600);
                frame.setVisible(true);
            });
        }
        static class MyButtonPanel extends JPanel {
            private JButton button = new JButton("1");
            private JButton button1 = new JButton("2");
            private JButton button2 = new JButton("3");
            private JButton button3 = new JButton("4");
            private JButton button4 = new JButton("5");
            public MyButtonPanel() {
                add(button);
                add(button1);
                add(button2);
                add(button3);
                add(button4);
            }
        }
        static class MyDrawPanel extends JPanel {
            public MyDrawPanel() {
                setLayout(null);
            }
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponents(g);
                Graphics2D g2 = (Graphics2D) g;
                g2.drawLine(10, 10, 500, 500);
            }
        }
    }

Панель с кнопками это одна панель, а с линией другая.

UPD Пример на одной панели:

    import javax.swing.*;
    import java.awt.*;
    public class Check {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.add(new MyDrawPanel(), BorderLayout.CENTER);
                frame.setSize(600, 600);
                frame.setVisible(true);
            });
        }
        static class MyDrawPanel extends JPanel {
            private JButton button = new JButton("1");
            private JButton button1 = new JButton("2");
            private JButton button2 = new JButton("3");
            private JButton button3 = new JButton("4");
            private JButton button4 = new JButton("5");
            MyDrawPanel() {
                setLayout(null);
                button.setSize(50, 20);
                button.setLocation(10, 10);
                add(button);
                button1.setSize(50, 20);
                button1.setLocation(40, 40);
                add(button1);
                button2.setSize(50, 20);
                button2.setLocation(50, 50);
                add(button2);
                button3.setSize(50, 20);
                button3.setLocation(80, 80);
                add(button3);
                button4.setSize(50, 20);
                button4.setLocation(10, 10);
                add(button4);
            }
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponents(g);
                Graphics2D g2 = (Graphics2D) g;
                g2.drawLine(10, 10, 500, 500);
            }
        }
    }
READ ALSO
Как можно заполнить контейнер для Tab?

Как можно заполнить контейнер для Tab?

Хочу сделать tab-s в NavigationActivityИ чтоб прокручивать со свайпом

249
Как сделать так, чтобы появлялось одно уведомление, а через интервал уже другое? (Android Java)

Как сделать так, чтобы появлялось одно уведомление, а через интервал уже другое? (Android Java)

Пытаюсь сделать уведомления в Android StudioМне нужно сделать так, чтобы сначала появилось одно уведомление, затем, минуя один интервал, появилось...

288
Паттерн в DecimalFormatSymbols

Паттерн в DecimalFormatSymbols

Используя такой формат

227
Анализ/парсинг .java файла

Анализ/парсинг .java файла

Стоит задача проанализировать файлы с расширениемjava начиная с корневого пакета проекта и построить зависимости на основании используемых...

167