【问题标题】:can JTextField resizable in a gridlayout?JTextField 可以在网格布局中调整大小吗?
【发布时间】:2021-07-30 21:55:13
【问题描述】:

下面是我测试BorderLayoutGridLayout的代码,但是我发现JPanel中的JTextField使用GridLayout是不可调整大小的,不管我改了多少次JTextField.setPreferredSize,它仍然保持不变。

public class Boderlayout implements ActionListener {
    JButton bCalculate;
    JLabel lPrinAmount,lInterestRate,lPayPerYear,lResult;
    JTextField tPrinAmount,tInterestRate,tPayPerYear,tResult;
    
    public static void main (String[] args) {
        new Boderlayout();
    }

    public Boderlayout() {
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        
        JPanel p2 = new JPanel();
        p2.setBackground(Color.BLUE);
        p2.setPreferredSize(new Dimension(600,100));
        frame.add(p2,BorderLayout.SOUTH);
        
        bCalculate = new JButton("Calculate");
        bCalculate.setPreferredSize(new Dimension(550,85));
        p2.add(bCalculate);
        bCalculate.addActionListener(this);
        
        JPanel p3 = new JPanel();
        p3.setBackground(Color.GREEN);
        p3.setLayout(new GridLayout(6,1));
        p3.setPreferredSize(new Dimension(300,300));
        frame.add(p3,BorderLayout.CENTER);
            
        lPrinAmount = new JLabel("Principle Amount: ");
        lPrinAmount.setPreferredSize(new Dimension(200,40));
        p3.add(lPrinAmount);
            
        tPrinAmount = new JTextField(20);
        tPrinAmount.setPreferredSize(new Dimension(170,40));
        p3.add(tPrinAmount);
            
        tPrinAmount.addActionListener(this);
            
        lInterestRate = new JLabel("Interest Rate: ");
        lInterestRate.setPreferredSize(new Dimension(200,40));
        p3.add(lInterestRate);
            
        tInterestRate = new JTextField(20);
        tInterestRate.setPreferredSize(new Dimension(100,40));
        p3.add(tInterestRate);
            
        tInterestRate.addActionListener(this);
            
        lPayPerYear = new JLabel("Payment Period (Year): ");
        lPayPerYear.setPreferredSize(new Dimension(200,40));
        p3.add(lPayPerYear);
            
        tPayPerYear = new JTextField(20);
        tPayPerYear.setPreferredSize(new Dimension(170,40));
        p3.add(tPayPerYear);
            
        tPayPerYear.addActionListener(this);
        
        JPanel p5 = new JPanel();
        p5.setLayout(new GridLayout(2,1));
        p5.setBackground(Color.WHITE);
        p5.setPreferredSize(new Dimension(300,300));
        frame.add(p5,BorderLayout.EAST);
        
        lResult = new JLabel("Result");
        lResult.setPreferredSize(new Dimension(170,40));
        p5.add(lResult);
            
        tResult = new JTextField(50);
        tResult.setPreferredSize(new Dimension(170,200));
        tResult.setEditable(false);
        p5.add(tResult);
        
        frame.pack();
        frame.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if (e.getSource() == bCalculate) {
            double prinAmount = Double.parseDouble(tPrinAmount.getText());
            double interestRate = Integer.parseInt(tInterestRate.getText());
            double paymentYear = Integer.parseInt(tPayPerYear.getText());
            
            double interestRatePercentage = interestRate / 100;
            double loanInterest = prinAmount * interestRatePercentage;
            double year = 12 * paymentYear;
            double mortgageResult = (loanInterest * (Math.pow((1 + (interestRatePercentage / 12)), year)) / (Math.pow((1 + (interestRatePercentage) / 12), year) - 1)) / 12;
            
            String stringmortgageResult = Double.toString(mortgageResult);
            String newline = System.getProperty("line.separator");
            String finalResult = "Principle Amount: " + tPrinAmount.getText() + newline + "Interest Rate: " + tInterestRate.getText() + "%" + newline + "Payment Period: " + tPayPerYear.getText()
            + newline + "Mortgage: " + stringmortgageResult;
            tResult.setText(finalResult);
        }
    }
}

【问题讨论】:

    标签: java swing jtextfield grid-layout


    【解决方案1】:

    请参阅How to Use GridLayout
    这是该网页的引述:

    GridLayout 对象将组件放置在单元格网格中。每个组件占用其单元格内的所有可用空间,并且每个单元格的大小完全相同。

    换句话说,GridLayout考虑它所包含的组件的首选大小。

    一个布局管理器会考虑其包含的组件的首选大小是GridBagLayout

    BorderLayout 仅考虑其包含的组件的部分首选大小。对于EAST 组件,BorderLayout 使用其首选宽度但不使用其首选高度。 BorderLayout 最初将使用其 CENTER 组件的首选宽度和高度。

    这是我在运行您的代码时得到的窗口。

    这是您使用GridBagLayout 而不是GridLayout 修改后的代码。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    public class Boderlayout implements ActionListener {
        JButton bCalculate;
        JLabel lPrinAmount, lInterestRate, lPayPerYear, lResult;
        JTextArea tResult;
        JTextField tPrinAmount, tInterestRate, tPayPerYear;
    
        public static void main(String[] args) {
            new Boderlayout();
        }
    
        public Boderlayout() {
            JFrame frame = new JFrame();
    
            JPanel p2 = new JPanel();
            p2.setBackground(Color.BLUE);
            p2.setPreferredSize(new Dimension(600, 100));
            frame.add(p2, BorderLayout.SOUTH);
    
            bCalculate = new JButton("Calculate");
            bCalculate.setPreferredSize(new Dimension(550, 85));
            p2.add(bCalculate);
            bCalculate.addActionListener(this);
    
            JPanel p3 = new JPanel();
            p3.setBackground(Color.GREEN);
            p3.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            p3.setPreferredSize(new Dimension(300, 300));
            frame.add(p3, BorderLayout.CENTER);
    
            lPrinAmount = new JLabel("Principle Amount: ");
            lPrinAmount.setPreferredSize(new Dimension(200, 40));
            gbc.gridx = 0;
            gbc.gridy = 0;
            p3.add(lPrinAmount, gbc);
    
            tPrinAmount = new JTextField(20);
            tPrinAmount.setPreferredSize(new Dimension(170, 40));
            gbc.gridy = 1;
            p3.add(tPrinAmount, gbc);
    
            tPrinAmount.addActionListener(this);
    
            lInterestRate = new JLabel("Interest Rate: ");
            lInterestRate.setPreferredSize(new Dimension(200, 40));
            gbc.gridy = 2;
            p3.add(lInterestRate, gbc);
    
            tInterestRate = new JTextField(20);
            tInterestRate.setPreferredSize(new Dimension(100, 40));
            gbc.gridy = 3;
            p3.add(tInterestRate, gbc);
    
            tInterestRate.addActionListener(this);
    
            lPayPerYear = new JLabel("Payment Period (Year): ");
            lPayPerYear.setPreferredSize(new Dimension(200, 40));
            gbc.gridy = 4;
            p3.add(lPayPerYear, gbc);
    
            tPayPerYear = new JTextField(20);
            tPayPerYear.setPreferredSize(new Dimension(170, 40));
            gbc.gridy = 5;
            p3.add(tPayPerYear, gbc);
    
            tPayPerYear.addActionListener(this);
    
            JPanel p5 = new JPanel();
            p5.setLayout(new BoxLayout(p5, BoxLayout.PAGE_AXIS));
            p5.setBackground(Color.WHITE);
            p5.setPreferredSize(new Dimension(300, 300));
            frame.add(p5, BorderLayout.EAST);
    
            lResult = new JLabel("Result");
            lResult.setPreferredSize(new Dimension(170, 40));
            p5.add(lResult);
    
            tResult = new JTextArea();
            tResult.setPreferredSize(new Dimension(170, 200));
            tResult.setEditable(false);
            tResult.setBorder(BorderFactory.createLineBorder(Color.darkGray));
            p5.add(tResult);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == bCalculate) {
                double prinAmount = Double.parseDouble(tPrinAmount.getText());
                double interestRate = Integer.parseInt(tInterestRate.getText());
                double paymentYear = Integer.parseInt(tPayPerYear.getText());
    
                double interestRatePercentage = interestRate / 100;
                double loanInterest = prinAmount * interestRatePercentage;
                double year = 12 * paymentYear;
                double mortgageResult = (loanInterest
                        * (Math.pow((1 + (interestRatePercentage / 12)), year))
                        / (Math.pow((1 + (interestRatePercentage) / 12), year) - 1)) / 12;
    
                String stringmortgageResult = Double.toString(mortgageResult);
                String newline = System.getProperty("line.separator");
                String finalResult = "Principle Amount: " + tPrinAmount.getText() + newline
                        + "Interest Rate: " + tInterestRate.getText() + "%" + newline
                        + "Payment Period: " + tPayPerYear.getText() + newline + "Mortgage: "
                        + stringmortgageResult;
                tResult.setText(finalResult);
            }
        }
    }
    

    这是我运行上述代码时得到的窗口。

    请注意,我将tResult 更改为JTextArea 而不是JTextField

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多