簡體   English   中英

嘗試使用滑塊在畫布上繪圖

[英]Trying to draw on a canvas with sliders

我正在嘗試使用 jslider 來允許用戶精確定位要在畫布上繪制的圓的原點。 我正在使用一個按鈕來顯示和隱藏圓圈。 我在內部 jpanel 上使用油漆,以便油漆不會覆蓋組件。 但是,jpanel 內的坐標與整個框架的坐標不同。 所以,我很難拿到jslider的坐標,然后再翻譯到jpanel來畫圓。 有沒有一種簡單的方法來解決這個問題而無需大量猜測和檢查? 我也在使用自定義布局 miglayout。 我已經包含了我的 GUI 類的代碼以及我制作的自定義 JPanel,這樣我就可以弄亂paint方法。

public class CircleGUI extends JFrame implements ActionListener {
    private MigLayout layout = new MigLayout();
    private CustomPanel innerpanel;
    private JSlider x,y;
    private JColorChooser colorpick;
    private JButton state;
    private boolean bstate;

CircleGUI()  {
    initialize();
}

private void initialize()  {
    Border blackline = BorderFactory.createLineBorder(Color.black);
    bstate = false;

    x = new JSlider(JSlider.HORIZONTAL,650,325);
    x.setPaintTicks(true);
    x.setPaintLabels(true);
    x.setPreferredSize(new Dimension(650,0));

    y = new JSlider(JSlider.HORIZONTAL,650,325);
    y.setPaintTicks(true);
    y.setPaintLabels(true);
    y.setInverted(true);
    y.setOrientation(JSlider.VERTICAL);
    y.setPreferredSize(new Dimension (0,600));

    colorpick = new JColorChooser();
    state = new JButton("Show");
    state.addActionListener(e -> {
        if(!bstate) {
            int positionx = x.getValue() - 80;
            int positiony = y.getValue();
            Color c = colorpick.getColor();
            innerpanel.setColor(c);
            innerpanel.setX(positionx);
            innerpanel.setY(positiony);
            innerpanel.repaint();
            state.setText("Hide");
            bstate = true;
        } else {
            Color transparent = new Color(0,0,0,0);
            innerpanel.setColor(transparent);
            innerpanel.repaint();
            state.setText("Show");
            bstate = false;
        }
    });
    JPanel outerpanel = new JPanel(layout);
    innerpanel = new CustomPanel();
    innerpanel.setPreferredSize(new Dimension(600,600));
    innerpanel.setBorder(blackline);
    outerpanel.add(x,"wrap");
    outerpanel.add(y,"split 2");
    outerpanel.add(innerpanel);
    outerpanel.add(state,"wrap");
    outerpanel.add(colorpick);
    
    this.setSize(1000, 1000);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add(outerpanel);
}

@Override
public void actionPerformed(ActionEvent e) {

}

}



public class CustomPanel extends JPanel implements ActionListener {


    private Color c;
    private int x;
    private int y;

public CustomPanel() {
    c = null;
}

@Override
public void actionPerformed (ActionEvent e) {

}


public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setPaint(c);
    g2.fill(new Ellipse2D.Double(x, y, 100, 100));
}

public void setColor(Color c) {
    this.c = c;
}

public void setX(int x) {
    this.x = x;
}

public void setY(int y) {
    this.y = y;
}
}

您的問題是您試圖在JSlider的值和CustomPanel的坐標之間進行一對一映射。 您應該使用JSlider值作為百分比,即最小值 0 和最大值 100。如果您希望圓圈出現在CustomPanel的中間,那么您將兩個JSlider放在它們的中點,即都在 50%。 然后計算相應尺寸的 50% 以獲得坐標。 如果CustomPanel的寬度是600,那么600的50%就是300所以positionx需要是300。

我在你的代碼中唯一改變的是positionxpositiony的計算。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.Border;

import net.miginfocom.swing.MigLayout;

public class CircleGUI extends JFrame implements ActionListener {
    private MigLayout layout = new MigLayout();
    private CustomPanel innerpanel;
    private JSlider x,y;
    private JColorChooser colorpick;
    private JButton state;
    private boolean bstate;

    CircleGUI() {
        initialize();
    }

    private void initialize() {
        Border blackline = BorderFactory.createLineBorder(Color.black);
        bstate = false;

//        x = new JSlider(JSlider.HORIZONTAL, 650, 325);
        x = new JSlider(0, 100, 10);
        x.setPaintTicks(true);
        x.setPaintLabels(true);
        x.setPreferredSize(new Dimension(650, 0));

//        y = new JSlider(JSlider.HORIZONTAL, 650, 325);
        y = new JSlider(0, 100, 10);
        y.setPaintTicks(true);
        y.setPaintLabels(true);
        y.setInverted(true);
        y.setOrientation(JSlider.VERTICAL);
        y.setPreferredSize(new Dimension(0, 600));

        colorpick = new JColorChooser();
        state = new JButton("Show");
        state.addActionListener(e -> {
            if (!bstate) {
                int positionx = Math.round(x.getValue() / 100.0f * innerpanel.getSize().width) - 50;
                int positiony = Math.round(y.getValue() / 100.0f * innerpanel.getSize().height) - 50;
                Color c = colorpick.getColor();
                innerpanel.setColor(c);
                innerpanel.setX(positionx);
                innerpanel.setY(positiony);
                innerpanel.repaint();
                state.setText("Hide");
                bstate = true;
            }
            else {
                Color transparent = new Color(0, 0, 0, 0);
                innerpanel.setColor(transparent);
                innerpanel.repaint();
                state.setText("Show");
                bstate = false;
            }
        });
        JPanel outerpanel = new JPanel(layout);
        innerpanel = new CustomPanel();
        innerpanel.setPreferredSize(new Dimension(600, 600));
        innerpanel.setBorder(blackline);
        outerpanel.add(x, "wrap");
        outerpanel.add(y, "split 2");
        outerpanel.add(innerpanel);
        outerpanel.add(state, "wrap");
        outerpanel.add(colorpick);

        this.setSize(1000, 1000);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(outerpanel);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            CircleGUI cg = new CircleGUI();
            cg.setVisible(true);
        });
    }
}

class CustomPanel extends JPanel implements ActionListener {
    private Color c;
    private int x;
    private int y;

    public CustomPanel() {
        c = null;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(c);
        g2.fill(new Ellipse2D.Double(x, y, 100, 100));
    }

    public void setColor(Color c) {
        this.c = c;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM