Невозможно вызвать JPanel внутри кнопки JPanel - PullRequest
1 голос
/ 30 декабря 2011

Выполнен поиск, и я действительно не нашел подходящего ответа с этой хитрой проблемой.

А вот и я, ребята. Заранее спасибо за помощь.

Я пытаюсь вызвать JPanel внутри кнопки JPanel с помощью actionlistener; хотя с первой добавленной кнопкой она работала нормально, для двух других она не работает; разница между jpanels, вызываемым в первой кнопке, и остальными двумя заключается в том, что первая кнопка вызывает другую Jpanel из текущей Jpanel; но два других зовут две частные классы jpanel в пределах существующих панелей jpanel.

Что я делаю: я пытаюсь отобразить две разные диаграммы в пределах одной Jpanel, используя две кнопки, взаимозаменяемо; частные jpanels используются исключительно для рисования диаграмм; Я думал, что мне нужно только вызывать эти две jpanels разными кнопками, не создавая совершенно новую JPanel для содержите каждую jpanel, чтобы нарисовать диаграмму, а затем назовите их так, как я называю другую jpanel в первой кнопке.

прошу прощения за мою неуклюжую формулировку .. вот коды.

открытый класс ExamPerf расширяет JPanel {

final JPanel viewPerf = TabbedQuiz.viewPerfPanel;

final ChartsPanel CP = new ChartsPanel ();

// Я создаю jpanel в его конструкторе; все кнопки здесь;

          public ExamPerf() {
    setBackground(Color.BLACK);

    setBounds(0, 0, 728, 380);
    setLayout(null);

    setBorder(BorderFactory.createLineBorder(Color.ORANGE, 10));
    setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createLineBorder(Color.ORANGE),
            "Exam Performance", 0, 0, new Font("Tahoma", Font.BOLD, 15),
            Color.WHITE));

    DrawCurrent drawarea=new DrawCurrent();
    add(drawarea);

// это первая кнопка, вызывающая другой Jpanel, совершенно другой класс;

    JButton backBut = new JButton("Main Menu");
    backBut.setFont(new Font("Tahoma", Font.BOLD, 11));
    backBut.setBounds(10, 24, 93, 23);
    add(backBut);
    backBut.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub

            setVisible(false);
            invalidate();
            viewPerf.add(CP);

        }
    });

// это вторая кнопка, я пытаюсь вызвать закрытый класс DrawCurrent; // но это не работает; моя мысль была,

    JButton histoPerf = new JButton("Historical Performance");
    histoPerf.setFont(new Font("Tahoma", Font.BOLD, 11));
    histoPerf.setBounds(122, 24, 161, 23);
    add(histoPerf);
    histoPerf.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            setVisible(false);

            invalidate();

            DrawCurrent drawplace=new DrawCurrent();


            add(drawplace, BorderLayout.CENTER);




        }
    });

// это третья кнопка, та же проблема.

          JButton currentPerf = new JButton("Current Performance");
    currentPerf.setFont(new Font("Tahoma", Font.BOLD, 11));
    currentPerf.setBounds(303, 24, 151, 23);
    add(currentPerf);
    currentPerf.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub

            setVisible(true);
            invalidate();

            DrawHistorical drawHis=new DrawHistorical();
            add(drawHis);




        }
    });

}

// это первый закрытый класс, DrawCurrent;

открытый класс DrawCurrent расширяет JPanel {

    public DrawCurrent() {
        setBackground(Color.BLACK);
        setForeground(null);

        setBounds(10, 49, 708, 320);

        setBorder(BorderFactory.createLineBorder(Color.ORANGE, 10));
        setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.ORANGE), "Chart", 0,
                0, new Font("Tahoma", Font.BOLD, 15), Color.WHITE));
        setLayout(null);

    }

    @Override
    public void paintComponent(Graphics g) {
        final Graphics2D canvas = (Graphics2D) g;
        final BasicStroke Pen = new BasicStroke(4, BasicStroke.CAP_ROUND,
                BasicStroke.JOIN_ROUND);

        canvas.setStroke(Pen);
        canvas.setColor(Color.LIGHT_GRAY);
        canvas.drawLine(5, 315, 703, 315);
        canvas.drawLine(getWidth() / 2, 700, getWidth() / 2, 19);

        // write the names of columns on top of them;
        canvas.setFont(new Font("Times New Roman", Font.BOLD, 13));
        canvas.drawString("Right", 50, 100);
        canvas.drawString("Wrong", getWidth() / 2 + 150, 300);

        // draw two 3D rectangles as the columns of the performances;
        //
        canvas.fill3DRect(50, 100, 40, 215, true);
        canvas.fill3DRect(getWidth() / 2 + 150, 300, 40, 15, true);

    }

}

// это второй закрытый класс, DrawHistorical;

закрытый класс DrawHistorical расширяет JPanel {

    final ArrayList<Integer> examCount=new ArrayList<>();

    final int leftEdge=10;

    public DrawHistorical() {
        setBackground(Color.BLACK);
        setForeground(null);

        setBounds(leftEdge, 49, 708, 320);

        setBorder(BorderFactory.createLineBorder(Color.ORANGE, 10));
        setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.ORANGE), "Chart", 0,
                0, new Font("Tahoma", Font.BOLD, 15), Color.WHITE));
        setLayout(null);

    }

    @Override
    public void paintComponent(Graphics g) {
        final Graphics2D canvas = (Graphics2D) g;
        final BasicStroke Pen = new BasicStroke(2, BasicStroke.CAP_ROUND,
                BasicStroke.JOIN_ROUND);

        canvas.setStroke(Pen);
        canvas.setColor(Color.LIGHT_GRAY);
        canvas.setFont(new Font("Times New Roman", Font.BOLD, 13));

        //this loop is to draw the graph of the historical performance of completed exams.
        for(int i=0; i<examCount.size();i=i+3){

            // write the number of exam on top of the lien graph.

        canvas.drawString("Ex"+examCount.get(i).toString(), leftEdge+i, examCount.get(i));

            // draw the line graph and extends as long as the number of completed exams increases.

        canvas.drawLine(leftEdge+2+i, examCount.get(i), leftEdge+3+i, examCount.get(i+1));

        }



    }

}

Большое спасибо, ребята, ничего непонятного, пожалуйста, бросьте их мне.

1 Ответ

0 голосов
/ 10 марта 2018

Добро пожаловать в переполнение стека. Здесь есть некоторые правила - я нахожусь здесь так долго, что не знаю их наизусть :) - но я помню что-то под названием SSCE. Простой автономный пример, который гарантирует, что вы получите много ответов от всех.

1) Фактическая проблема заключается в том, что вы создаете новые панели прямо в обработчике действий:

public void actionPerformed(ActionEvent arg0) {
    setVisible(false);
    invalidate();
    DrawCurrent drawplace=new DrawCurrent();
    add(drawplace, BorderLayout.CENTER);
} 

и делать странные вещи здесь.

1) setVisible (false) скрывает что-то на экране - не панель, которую я предполагаю, а скорее всего внешнюю панель.

2) вы создаете новый экземпляр DrawCurrent и добавляете его в макет вместо того, чтобы скрывать другую панель и делать эту панель видимой.

Правильная логика: создать экземпляры DrawCurrent и DrawHistorical одновременно в классе ExamPerf, добавить add в его макет:

DrawCurrent current;
DrawHistorical historical;

public ExamPerf() extends JPanel {
    current=new DrawCurrent();
    historical=new Historical();
    add(current); // TODO you may need further layout settings here
    add(historical);  // TODO you may need further layout settings here
    current.setVisible(true);
    historical.setVisible(false);
}

А в слушателях кнопок просто измените видимые свойства панелей диаграммы :

public void actionPerformed(ActionEvent arg0) {
    current.setVisible(false); 
    history.setVisible(true);
} 

(и то же самое для другой кнопки, которая показывает true и false, чтобы показать другую панель).


В качестве альтернативы, вместо реализации собственного обходного пути, рассмотрите возможность использования CardLayout, который предназначен для решения этой проблемы "из коробки".

https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

...