Java JSlider не отображается после использования JFileChooser - PullRequest
0 голосов
/ 01 июля 2019

Когда я использую JFileChooser, попробуйте добавить другие компоненты, они не отображаются. Если я удаляю JFileChooser, они появляются. Я пишу в Java на Eclipse, и есть два файла.

Я удалил большую часть своего кода, чтобы упростить проблему, но она все еще существует.

Main.java:

import java.awt.Color;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;

public class Main {
    public static void main(String args[]) throws InterruptedException, IOException {
        int width = 1280;
        int height = 720;

        Frame f = new Frame(Color.BLACK, width, height);
        JFrame frame = new JFrame("Title"); //create a new window and set title on window
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //set the window to close when the cross in the corner is pressed
        frame.setSize(width,height);

        frame.add(f); //add the content of the game object to the window
        frame.setVisible(true);

        long interval = (long)10 * 10000000;
        long t = 0;
        while(true) {
            if(System.nanoTime() - t >= interval) { //repaints at a certain fps
                t = System.nanoTime();
                f.repaint();
            }
            TimeUnit.NANOSECONDS.sleep(10);
        }
    }
}

Frame.java:

import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import javax.swing.JSlider;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;

public class Frame extends JPanel {
    int menuNum = 0;
    boolean first = true;

    JButton nextButton = new JButton("Next");
    JSlider slider = new JSlider(0,255,0);
    JFileChooser fileChooser = new JFileChooser();

    public Frame(Color background, int w, int h) throws IOException { //initialize
        this.setBackground(background);
        setFocusable(true);
    }

    public void paintComponent(Graphics G) {
        super.paintComponent(G);

        G.setColor(Color.WHITE);
        G.drawString("MenuNum: " + menuNum, 1000, 500); //for debugging

        if(menuNum == 0) { //first menu
            if(first) { //only run once
                first = false;

                this.removeAll();
                this.add(nextButton);

                System.out.println("HERE");
            }
            if(fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { //if "Done" is selected
                menuNum = 1; //go to next menu
                first = true;
            }
        }

        if(menuNum == 1) { //second menu
            if(first) { //only run once
                first = false;

                this.removeAll();
                this.add(nextButton);
                this.add(slider); //<This is the slider that is not showing up

                System.out.println("HERE2");
            }
        }
    }
}

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

Я немного новичок в JPanels и JFrames, поэтому любые советы будут высоко оценены. Спасибо.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Прежде всего, нет абсолютно никакой причины делать какие-либо заказные картины.Никогда не пытайтесь добавлять / удалять компоненты из JPanel в методе рисования.

Компоненты должны быть добавлены на панель в конструкторе вашего класса.Таким образом, это означает, что кнопка должна быть добавлена ​​на панель.

Затем вы добавляете ActionListener к кнопке.Когда кнопка нажата, вы выполняете некоторую обработку.

Если вы хотите изменить компоненты на панели в ActionListener, тогда основная логика:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();

Итак, вам нужноrevalidate() для вызова менеджера макета.В противном случае размер добавляемого компонента равен (0, 0), что означает, что рисовать нечего.

Изучите основы Swing, прочитав Swing Tutorial .Может быть, начать с раздела:

  1. Как написать ActionListener
  2. Как использовать ползунки
  3. Как использовать CardLayout (вместо добавления / удаления компонентов).
1 голос
/ 01 июля 2019

Просто следуйте той же идее, вы получите

public MyControlPanel() {
    initComponents();
    JSlider slider = new JSlider();
    slider.setMajorTickSpacing(10);
    slider.setPaintLabels(true);
    slider.setPaintTicks(true);

    JTextField boundary_length = new JTextField("Boundary Length");
    JTextField area = new JTextField("Area");

    setLayout(new FlowLayout());

    this.add(slider);
    this.add(area);
    this.add(boundary_length);

}
...