Swing Button in Textfeld (JFormattedTextField)

casi91

Bekanntes Mitglied
Hallo Community,
habe gerade ein kleines Designproblem.
Ich möchte ein Textfeld haben das am rechten Ende einen Button hat (also nicht neben dem Textfeld, sondern innerhalb des Textfeldes)
Wenn man diesen Button drückt, soll ein Dialog aufgerufen werden etc.

Das ganze sollte am besten mit einem JFormattedTextField passieren.

Hat da jemand eine Idee?
Ist mein Problem verständlich?

Danke schonmal im vorraus 🙂
 
Das sieht doch gut aus.
Danke für den Link.
Werds mal ausprobieren und dann schreiben obs geklappt hat 🙂
Wenn jemand noch einen anderen Weg kennt, immer her damit
 
So far so good.
Hab nun das Panel, mein Textfeld und den Button:

Java:
public class buttonTextField extends JPanel {

	private JFormattedTextField textField = new JFormattedTextField();
	private JButton textButton			= new JButton("...");
	/**
	 * 
	 */
	private static final long serialVersionUID = 4909531777878836225L;

	public buttonTextField() {
		initialize();
	}

	public buttonTextField(LayoutManager layout) {
		super(layout);
		initialize();
	}

	public buttonTextField(boolean isDoubleBuffered) {
		super(isDoubleBuffered);
		initialize();
	}

	public buttonTextField(LayoutManager layout, boolean isDoubleBuffered) {
		super(layout, isDoubleBuffered);
		initialize();
	}

	private void initialize() {
		GridBagLayout gbLayout 		= new GridBagLayout();
		GridBagConstraints gbconst 	= new GridBagConstraints();
		setLayout(gbLayout);
		setBorder(new BevelBorder(BevelBorder.LOWERED));
		
		gbconst.gridx				= 0;
		gbconst.gridy				= 0;
		gbconst.gridwidth			= 2;
		gbconst.fill				= GridBagConstraints.BOTH;
		gbconst.anchor				= GridBagConstraints.FIRST_LINE_START;
		gbconst.weightx				= 1.0;
		gbconst.weighty				= 0.0;
		add(textField, gbconst);
		textField.setBorder(null);
		
		gbconst.gridx				= 2;
		gbconst.gridwidth			= 1;
		gbconst.fill				= GridBagConstraints.NONE;
		gbconst.anchor				= GridBagConstraints.LAST_LINE_END;
		gbconst.weightx				= 0.0;
		gbconst.weighty				= 0.0;	
		add(textButton, gbconst);
	}
	
	public JFormattedTextField getTextField() {
		return textField;
	}

	public void setTextField(JFormattedTextField textField) {
		this.textField = textField;
	}

	public JButton getTextButton() {
		return textButton;
	}

	public void setTextButton(JButton textButton) {
		this.textButton = textButton;
	}
	
	public String getText() {
		return textField.getText();
	}
}

Das Feld wird im gesamten nur etwas groß, sobald in dem Button irgendeine Beschriftung steht.
Wie kann ich das unterbinden?
Versucht hab ich es schon mit "setPreferredSize" und "setMaximumSize"
Bisher ohne erfolg.
 
Wenn dir die Größen und Position, die der Layoutmanager für deine Komponenten bestimmt, nicht passen, könntest du deinen eigenen Layoutmanager schreiben. Und wen du das tust, kann das JPanel gleich zu seinem eigenen Layoutmanager werden.
ich musste mal eine zusammengesetzte Komponente erstellen basierend auf JPanel, bei der sich die Position und Ausrichtung der Einzelkomponenten nicht auf eine einfache, offensichtliche Weise mit den verfügbaren Layoutmanagern realisieren liess. Anstatt nachzuforschen, wie es vielleicht doch gehen könnte, habe ich die (eigentlich einfache) Layoutlogik in das JPanel integriert. Das ganze sah ungefär so aus:
Java:
public class SelfLayoutingJPanel {

    private JFrame main;

    public SelfLayoutingJPanel() {
        main = new JFrame("Demo");
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel mainPanel = new JPanel(new GridLayout(2, 2));
        for(int i = 0; i < 4; i++){
            mainPanel.add(new LayoutPanel());
        }
        main.getContentPane().add(mainPanel);
        main.pack();
        System.out.println("Panel size " + mainPanel.getPreferredSize());
        main.setVisible(true);
    }

    public static void main(String[] args) {
        SelfLayoutingJPanel demo = new SelfLayoutingJPanel();
    }
}

class LayoutPanel extends JPanel implements LayoutManager{
    JTextField tf = new JTextField("TextField",10);
    JButton b = new JButton("#");
    Dimension zero = new Dimension(0, 0);

    LayoutPanel(){
        super();
        setLayout(this);
        add(b);
        add(tf);
    }
    public void addLayoutComponent(String key, Component c) {
    }

    public void removeLayoutComponent(Component c) {
    }

    public Dimension preferredLayoutSize(Container target) {
        System.out.println("In preferredLayoutSize(Container target)");
        Dimension dim = new Dimension(0, 0);
        dim.width = tf.getPreferredSize().width + tf.getPreferredSize().height;
        dim.height = tf.getPreferredSize().height;
        System.out.println("Result: " + dim);
        return dim;
    }

    public Dimension minimumLayoutSize(Container target) {
        return new Dimension(tf.getPreferredSize().height, 2 * tf.getPreferredSize().height);
    }

    public void layoutContainer(Container c) {
        int maxWidth = c.getWidth();
        int maxHeight = c.getHeight();
        int availableForTextField = maxWidth - tf.getPreferredSize().height;
        Rectangle tfBounds = new Rectangle(0, 0, availableForTextField, tf.getPreferredSize().height);
        Rectangle buttonBounds = new Rectangle(availableForTextField, 0, tf.getPreferredSize().height, tf.getPreferredSize().height);
        System.out.println("TF Bounds: " + tfBounds);
        System.out.println("Button Bounds: " + buttonBounds);
        tf.setLocation(tfBounds.x, tfBounds.y);
        tf.setSize(tfBounds.width, tfBounds.height);
        b.setLocation(buttonBounds.x, buttonBounds.y);
        b.setSize(buttonBounds.width, buttonBounds.height);
    }
}
 

Zurück
Oben