Ошибки с setFrame, JSlider

Поэтому я тестирую JSlider для более крупного проекта и не могу заставить его работать. Ползунок должен регулировать размер круга, и он не работает. Я подумал, что у меня могут быть проблемы с созданием круга, и я пытаюсь использовать setFrame, и он выдает ошибку, говоря, что это "неопределено". Кто-нибудь может понять почему? Так как он должен принимать либо float, либо double как параметры. Или, если вы понимаете, почему он не регулирует размер фигуры, это тоже очень поможет... Вот что у меня есть:

public class DrawShape extends JPanel{
private float width = 300;
private Shape circle = new Ellipse2D.Float(100, 20, width, 300); 

public DrawShape() {

}

public DrawShape(float width) {
    this.width = width;
}

public void setWidth(int w) {
    this.width = w;
        circle.setFrame(100, 20, width, 300);//This is where the error is
}

public void paintComponent (Graphics g) {
     super.paintComponents(g);
     Graphics2D graphics = (Graphics2D)g;

     graphics.setColor(Color.black);
     graphics.fill(circle);


}//end paintComponent

}//end class

Класс с основным:

public class SliderTest extends JFrame{

private static DrawShape circle = new DrawShape();
JSlider slider;
JLabel label;


public SliderTest()  {

    setLayout(new FlowLayout());
    slider = new JSlider(JSlider.HORIZONTAL, 150, 450, 300);//orientation, min val, max value, starting val
    slider.setMajorTickSpacing(50);//every 5 integers will be a new tick position 
    slider.setPaintTicks(true);
    add(slider);

    label = new JLabel("Current value 300");
    add(label);

    event e = new event();
    slider.addChangeListener(e);;


}//end cons

public class event implements ChangeListener{

    public void stateChanged(ChangeEvent e) {
         JSlider slider = (JSlider)e.getSource();
         int value = slider.getValue();
        label.setText("Current Value " + value);

        circle.setWidth(value);
        repaint();

    }//end stateChanged
}//end class event 



public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setTitle("Circle");
    frame.add(circle);
    frame.setSize(500,400);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true); 

    JFrame frame1 = new SliderTest ();
    frame1.setTitle("Toolbar");
    frame1.setSize(300,200);
    frame1.setLocation(200,100);
    frame1.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame1.setVisible(true);  
}

}

1 ответ

Shape не имеет setFrame метод. RectangularShape делает...

Вместо

private Shape circle = new Ellipse2D.Float(100, 20, width, 300); 

Вы можете попробовать использовать...

private Ellipse2D circle = new Ellipse2D.Float(100, 20, width, 300); 

вместо...

Ваш public DrawShape(float width) { Конструктор также не прав, так как он на самом деле ничего не делает.

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

Я не уверен, что вам действительно нужно поддерживать width ссылка, как вы можете убедиться в этом из circle непосредственно... ИМХО

Например

Я не проверял это...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;


public class DrawShape extends JPanel {

    private final Ellipse2D circle = new Ellipse2D.Float(100, 20, 300, 300);

    public DrawShape() {

    }

    public DrawShape(float width) {
        circle.setFrame(100, 20, width, 300);
    }

    public void setWidth(int w) {
        circle.setFrame(100, 20, w, 300);
        revalidate();
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width = circle.getBounds().width;
        return size;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        Graphics2D graphics = (Graphics2D) g;

        graphics.setColor(Color.black);
        graphics.fill(circle);

    }//end paintComponent

}//end class
Другие вопросы по тегам