java - 使用 JScrollBar 更新组件

标签 java swing user-interface jscrollbar

public class FaceMain extends JFrame {
CreateFace p1 = new CreateFace();
private ControlPanel panel;

public FaceMain(ControlPanel value) {
panel = value;
    JFrame main = new JFrame();
    main.setTitle("Face Frame");
    main.setSize(new Dimension(600, 600));
    main.setLocationRelativeTo(null);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setVisible(true);

    Container c = main.getContentPane();
    main.add(p1);
    panel.eyesSetE(true);
    JFrame control = new JFrame();
    control.setTitle("Control Panel");
    control.setSize(new Dimension(300, 300));
    control.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    control.setLocationRelativeTo(main);
    control.setVisible(true);

    ControlPanel p2 = new ControlPanel(p1);
    control.add(p2);

}
}

public class ControlPanel extends JPanel {
boolean eyesSetEdit = false, faceSetEdit = false, mouthSetEdit = false,
        editEyes;
private Color purple = new Color(133, 22, 145);
private CreateFace face;
private CreateFace p1;

public ControlPanel(CreateFace value) {
    face = value;
    p1 = value;
    setLayout(new GridLayout(4, 0));
    JButton change = new JButton("Click");
    add(change);
    JLabel info = new JLabel("Click Above To Change Features",
            JLabel.CENTER);
    add(info);
    JLabel info1 = new JLabel("Slide Below To Change Size", JLabel.CENTER);
    add(info1);
    JScrollBar slider = new JScrollBar(Scrollbar.HORIZONTAL, 0, 100, 0, 300);
    add(slider);
public void eyesSetE(boolean x) {
    eyesSetEdit = x;
}

public boolean getEyesSet() {
    return eyesSetEdit;
}

我扩展了我的类以尝试更改一个 boolean 值,该值将在 ControlPanel 类中广泛使用以做出决定,但是每次我启动程序时,我都会在“panel.eyesSetE(true);”行得到一个空指针异常。即使我尝试调用 getEyesSet(),我仍然收到空指针

最佳答案

您永远不会在 CreateCircle 类中更改 circle 的实例,因此它永远不会改变大小。

不要使用 static 作为实例变量,而是使用您创建的类的实例并提供一个 setter 方法来更改变量...

基本上,此示例将 p1 的实例传递给 ControlPanel Pane ,以便它具有一些上下文来操作您之前创建的内容。

import datetest.CircleShort.ControlPanel;
import datetest.CircleShort.CreateCircle;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Scrollbar;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollBar;

public class CircleShort extends JFrame {

    CreateCircle p1 = new CreateCircle();

    public CircleShort() {
        CreateCircle p1 = new CreateCircle();
        JFrame main = new JFrame();
        main.setSize(new Dimension(600, 600));
        main.setLocationRelativeTo(null);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setVisible(true);

        Container c = main.getContentPane();
        main.add(p1);
        JFrame control = new JFrame();
        control.setTitle("Control Panel");
        control.setSize(new Dimension(300, 300));
        control.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        control.setLocationRelativeTo(main);
        control.setVisible(true);

        ControlPanel p2 = new ControlPanel(p1);
        control.add(p2);

    }

    static class CreateCircle extends JComponent {

        int circleX = 100;
        Ellipse2D.Double circle;

        public CreateCircle() {
            circle = new Ellipse2D.Double(circleX, 50, 400, 350);
        }

        public void setCircleX(int x) {
            circleX = x;
            circle = new Ellipse2D.Double(circleX, 50, 400, 350);
            repaint();
        }

        public int getCircleX() {
            return circleX;
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.red);
            g2.fill(circle);
        }
    }

    class ControlPanel extends JComponent {

        private CreateCircle circle;

        public ControlPanel(CreateCircle value) {
            circle = value;
            setLayout(new GridLayout(4, 0));
            JButton change = new JButton("Click");
            add(change);
            JLabel info = new JLabel("Click Above To Change Color",
                    JLabel.CENTER);
            add(info);
            JLabel info1 = new JLabel("Slide Below To Change Size",
                    JLabel.CENTER);
            add(info1);
            JScrollBar slider = new JScrollBar(Scrollbar.HORIZONTAL, 0, 100, 0,
                    300);
            add(slider);
            slider.addAdjustmentListener(new AdjustmentListener() {

                public void adjustmentValueChanged(AdjustmentEvent e) {
                    System.out.println(e.getValue());
                    circle.setCircleX((circle.getCircleX() + (e.getValue() % 5)));
                }

            });

        }
    }

    static class CircleRun {

        public static void main(String[] args) {
            new CircleShort();
        }
    }
}

static 是邪恶的,直到你真正理解如何使用它。如果你发现自己制作了一些字段或方法 static 只是因为你似乎无法弄清楚如何访问它,那么你可能做错了什么,小心它......

这实际上提出的下一个问题是,“为什么?”

A JSlider将是更适合使用的控件,并且在概念上更容易让用户理解

关于java - 使用 JScrollBar 更新组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19921461/

相关文章:

java - 使用值删除 Swing 中的复选框

C GUI 程序在运行时崩溃

java - 使用标记在 JavaFX 中验证文本字段

java - BufferedReader和InputStream读取错误

java - 如何使用 WebDriver 验证 WebElement 是否显示在视口(viewport)中?

java - StyledEditorKit - 文档 - NotSerializedException

wpf - CefSharp ChromiumWebBrowser - 允许用户放大/缩小

java - for循环将数组元素实例化为一个对象,但我还是必须手动实例化?

java - 如何扩展 SQLiteDatabase 类?

java - 在JAVA中如何停止程序直到按下按钮?