3

誰かが実行時にの幅を設定する方法を教えてもらえJTextFieldますか?実行時にテキストフィールドのサイズを変更したい。ユーザーに長さを尋ねると、入力によってテキストフィールドの幅が変更されます。

if(selectedComponent instanceof javax.swing.JTextField){
    javax.swing.JTextField txtField = (javax.swing.JTextField) selectedComponent;
    //txtField.setColumns(numInput); //tried this but it doesn't work
    //txtField.setPreferredSize(new Dimension(numInput, txtField.getHeight())); //also this
    //txtField.setBounds(txtField.getX(), txtField.getY(), numInput, txtField.getHeight()); 
    //and this
    txtField.revalidate();
}

null編集モードなので、レイアウトを使用しています。

4

3 に答える 3

6

を使用する必要がありますjTextFieldObject.setColumns(int columnSize)。これにより、実行時にサイズを大きくすることができます。あなたが最後にそれをすることができなかった理由はnullレイアウトです。null Layout/Absolute Positioningこれが、の使用が推奨されない主な理由の1つです。これがあなたの手を試すための小さな例です:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JTextFieldExample
{
    private JFrame frame;
    private JPanel contentPane;
    private JTextField tfield;
    private JButton button;
    private int size = 10;

    private ActionListener action = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            String input = JOptionPane.showInputDialog(
                                frame, "Please Enter Columns : "
                                                , String.valueOf(++size));
            tfield.setColumns(Integer.parseInt(input));                 
            contentPane.revalidate();
            contentPane.repaint();
        }
    };

    private void createAndDisplayGUI()
    {
        frame = new JFrame("JTextField Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           

        contentPane = new JPanel();
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        tfield = new JTextField();
        tfield.setColumns(size); 

        JButton  button = new JButton("INC Size");
        button.addActionListener(action);

        contentPane.add(tfield);
        contentPane.add(button);

        frame.getContentPane().add(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new JTextFieldExample().createAndDisplayGUI();
            }
        });
    }
}

絶対的なポジショニングについては、結果を得るsetSize()にはを呼び出す必要がありますが、 Java Docの最初の段落JTextFieldに示されているように、このアプローチが推奨されない理由を常に念頭に置く必要があります。

レイアウトマネージャーなしで実行することは可能ですが、可能であればレイアウトマネージャーを使用する必要があります。レイアウトマネージャーを使用すると、ルックアンドフィールに依存するコンポーネントの外観、さまざまなフォントサイズ、コンテナーのサイズの変更、およびさまざまなロケールへの調整が容易になります。レイアウトマネージャーは、他のコンテナーや他のプログラムでも簡単に再利用できます。

于 2012-07-15T03:50:52.680 に答える
1

を使用するだけでテキストフィールドのサイズを変更できましたsetBounds。次の例を確認してください。

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Resize extends JFrame{
    public JTextField jtf = new JTextField();

    public Resize(){
    //frame settings
    setTitle("Resizable JTextField");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(null);
    setSize(new Dimension(600,400));
    setResizable(false);

    //init and add text field to the frame
    add(jtf);
    jtf.setBounds(20,50,200,200);

    //button to change text field size
    JButton b = new JButton("Moar.");
    add(b);
    b.setBounds(20,20,b.getPreferredSize().width,b.getPreferredSize().height);
    b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent evt){
            jtf.setBounds(20,50,jtf.getSize().width+10,jtf.getSize().height); //THIS IS WHERE THE RESIZING HAPPENS
        }
        });

    setVisible(true);
    }
    public static void main(String[] args){
    Resize inst = new Resize();
    }
}
于 2012-07-15T04:08:45.007 に答える
0

「楽しい」小さな自分で実行するソリューション:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    JTextField jTextField = new JTextField("Alice");
    JPanel panel = new JPanel();
    JButton grow = new JButton("DRINK ME");
    JButton shrink = new JButton("EAT ME");
    panel.add(jTextField);
    panel.add(grow);
    panel.add(shrink);
    frame.add(panel);
    frame.setVisible(true);
    frame.pack();
    grow.addActionListener(l -> resize(frame, jTextField, 2));
    shrink.addActionListener(l -> resize(frame, jTextField, 0.5f));
}

private static void resize(JFrame frame, Component toResize, float factor) {
    System.out.println(toResize.getPreferredSize());
    toResize.setPreferredSize(new Dimension((int)(toResize.getPreferredSize().width * factor),
                                            (int)(toResize.getPreferredSize().height * factor)));
    toResize.setFont(toResize.getFont().deriveFont(toResize.getFont().getSize() * factor));
    frame.pack();
}

注意:ケーキを食べすぎると死に至る可能性があることに注意してください。

于 2018-04-21T15:27:36.747 に答える