BoxLayout zentriert Label nicht

Hallo,
Ich versuche als "Übungsprojekt" für meine Swing-Kenntnisse ein Programm zu entwickeln, bei dem man erst in einem Fenster über einen JSlider die Zeit angeben kann, und nachdem man auf einen Knopf gedrückt hat, in dem darauffolgenden Fenster für die entsprechende zeit so oft versucht, wie möglich den Knopf zu drücken um die CPS (Clicks Per Second) zu berechnen.

Ich habe die grundsätzliche Logik für mein erstes Fenster geschrieben, jedoch wird das JLabel, das den momentanen Stand des JSliders anzeigen soll nicht zentriert über dem Jslider angezeigt, sondern ein bisschen nach links versetzt.

Ich habe um dies umzusetzen ein vertikales BoxLayout in einem FlowLayout (damit der Knopf dann rechts daneben ist) verschachtelt. Aber ich verstehe nicht, weshalb das JLabel nicht zentriert über dem JSlider liegt.

13020
Auf dem Bild ist das Fenster zu sehen, dass das ungewünschte Ergebnis zeigt.

Da Ich den Fehler nicht genau identifizieren konnte, und ich den fehler nur auf das BoxLayout einschätze, ist nun im folgenden der ganze Quellcode aufgelistet, ich hoffe, das stellt keine zu großen Probleme dar.

Java:
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;


public class CPS {
    JFrame frame;
    JSlider timeSlider;
    JLabel stateTimeSlider;
    final int timeMax = 60;
    final int timeMin = 0;
    JButton button;
    Container mainPane;
    JPanel sliderPane;
    int duration;

    public CPS(){
        frame = new JFrame("CPS");
        button = new JButton("Start");
        stateTimeSlider = new JLabel("BeispielText");
        mainPane = new Container();
        sliderPane = new JPanel();
        initSlider();
        initFrame();
        initButton();
        mainPane.setLayout(new FlowLayout());
        sliderPane.setLayout(new BoxLayout(sliderPane, BoxLayout.Y_AXIS));
    }

    private void initSlider() {
        timeSlider = new JSlider(JSlider.HORIZONTAL, timeMin, timeMax, 0);
        timeSlider.setMajorTickSpacing(10);
        timeSlider.setMinorTickSpacing(5);
        timeSlider.createStandardLabels(1);
        timeSlider.setPaintTicks(true);
        timeSlider.setPaintLabels(false);

        timeSlider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                duration = timeSlider.getValue();
                stateTimeSlider.setText("Time: " + duration);
            }
        });
        sliderPane.add(timeSlider);
    }


    private void initButton() {
        button.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(duration != 0){
                    //Start des nächsten Fensters
                    System.out.println("done");
                    frame.dispose();
                }
            }
            @Override
            public void mousePressed(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
        });
    }

    private void initFrame() {
        frame.setResizable(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
    }

    public void init() {
        timeSlider.setVisible(true);
        button.setVisible(true);
        stateTimeSlider.setVisible(true);

        sliderPane.add(stateTimeSlider);
        sliderPane.add(timeSlider);

        mainPane.add(sliderPane);
        mainPane.add(button);

        frame.add(mainPane);
        frame.setVisible(true);
    }
}

In meiner Hauptklasse erstelle ich nur noch ein Objekt aus dieser Klasse, und rufe danach die Funktion init() auf.

Ich bedanke mich im Voraus um die Bemühungen,

Gruß [anonym] 😉
 
Ich habe die grundsätzliche Logik für mein erstes Fenster geschrieben, jedoch wird das JLabel, das den momentanen Stand des JSliders anzeigen soll nicht zentriert über dem Jslider angezeigt, sondern ein bisschen nach links versetzt.
Probiere diesen Code aus. Ich denke der mach das was du willst.
Java:
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("SliderLabel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TestPanel(300, 300));
        frame.pack();
        frame.setVisible(true);
    }
}
Java:
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.EtchedBorder;

@SuppressWarnings("serial")
public class TestPanel extends JPanel {
    public TestPanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        SliderLabel sliderLabel = new SliderLabel();       
        sliderLabel.setLabel("Hallo");
        sliderLabel.setShowLabel(true);
        sliderLabel.setShowValue(true);
        sliderLabel.setPreferredSize(new Dimension(500 , 70));
        sliderLabel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
        JSlider slider = sliderLabel.getSlider();
        slider.setMajorTickSpacing(10);
        slider.setMinorTickSpacing(5);
        slider.setPaintTicks(true);
        slider.setValue(0);
        slider.setMajorTickSpacing(10);
        slider.setMinorTickSpacing(5);
        slider.setPaintTicks(true);
        add(sliderLabel);
    }
}
Java:
import java.awt.BorderLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

@SuppressWarnings("serial")
public class SliderLabel extends JPanel implements ChangeListener {
    public final static int LABEL_TOP = 0;
    public final static int LABEL_BOTTOM = 1;
    public final int SLIDER = 0;
    public final int LABEL = 1;
    public final int VALUE = 2;
    private JComponent[] item = new JComponent[] { new JSlider(), new JLabel(), new JLabel("0") };
    private boolean showValue = false;
    private boolean showLabel = false;
    private int order = LABEL_BOTTOM;

    public SliderLabel() {
        setLayout(new BorderLayout(2, 2));
        setOrder(order);
        for (int i = 1; i < item.length; i++) {
            getLabel(i).setHorizontalAlignment(SwingConstants.CENTER);
            getLabel(i).setOpaque(true);
        }
    }

    public JLabel getLabel(int id) {
        if (id < 1 || id > item.length - 1)
            return null;
        return (JLabel) item[id];
    }

    public JSlider getSlider() {
        return (JSlider) item[SLIDER];
    }

    public void setOrder(int order) {
        if (order != LABEL_TOP && order != LABEL_BOTTOM)
            return;
        this.order = order;
        for (JComponent c : item)
            remove(c);
        if (order == LABEL_BOTTOM) {
            if (showLabel)
                add(item[LABEL], BorderLayout.SOUTH);
            add(item[SLIDER], BorderLayout.CENTER);
            if (showValue)
                add(item[VALUE], BorderLayout.NORTH);
        } else {
            if (showValue)
                add(item[VALUE], BorderLayout.SOUTH);
            add(item[SLIDER], BorderLayout.CENTER);
            if (showLabel)
                add(item[LABEL], BorderLayout.NORTH);
        }
        if (showValue)
            getSlider().addChangeListener(this);
        else
            getSlider().removeChangeListener(this);
    }

    public void setShowLabel(boolean showLabel) {
        this.showLabel = showLabel;
        setOrder(order);
    }

    public void setShowValue(boolean showValue) {
        this.showValue = showValue;
        setOrder(order);
    }

    public void setLabel(String text) {
        getLabel(LABEL).setText(text);
    }

    @Override
    public void stateChanged(ChangeEvent e) {
        getLabel(VALUE).setText(getSlider().getValue() + "");
    }

}
😉
 

Neue Themen


Zurück
Oben