【问题标题】:JTextField permanent Position/Location?JTextField 永久位置/位置?
【发布时间】:2014-09-03 12:26:30
【问题描述】:

所以我对我的 JTextField 有疑问。 我要做的是将 JTextField 框放在图片下方(某个城镇的地图)。 是的,我使用了 .setBounds 并且它已经在图像下方,但我想要发生的是,如果我使用 .pack();,它必须仍然可见。不幸的是,事实并非如此。

我尝试使用 .setBorder(BorderFactory.createEmptyBorder(5,50,0,50));我看到该框在图片下方,但不再可用于放置文本。

最后,我想要图片下方的 JTextField,并且在我打包时仍然必须可见。

请帮忙。谢谢你。 我仍然处于发现关于 GUI 的新事物的阶段。 抱歉这个菜鸟问题。

  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.FlowLayout;
  import java.awt.Font;

  import javax.swing.BorderFactory;
  import javax.swing.ImageIcon;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.SwingUtilities;
  import javax.swing.JTextField;

  class ProgDraftMain {

   public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            ProgDraft gui = new ProgDraft();
            gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            gui.setResizable(false);
            gui.pack();
            //gui.setSize(1000 , 1000);
            gui.setVisible(true);           
        }
    });
}
}

class ProgDraft extends JFrame {
private ImageIcon image1;
private JLabel label1;
private JTextField textField1;

ProgDraft() {

    /***Panel**/ 
    JPanel panel = new JPanel();
    panel.setLayout(new FlowLayout(FlowLayout.LEADING));

    /***Title***/
    JLabel title = new JLabel("Perimeter Check", JLabel.CENTER);
    Font font = new Font("Gigi", Font.BOLD, 50);
    title.setFont(font);

    /***Image***/
    ImageIcon pics = new ImageIcon(getClass().getResource("antipolo.png"));

    JLabel logo = new JLabel(pics);
    logo.setBorder(BorderFactory.createEmptyBorder(10, 70, 0, 50));
    logo.setToolTipText("Ito raw kunware yung barangay.");
    panel.add(logo);

    /***Info ANtipolo***/
    String text = "Ito kunware ang ANtipolo" + "<br>" +
          "Marami ditong landslide areas" + "<br>" + "<br>" +
          "Take care and stay safe!" + "<br>" +
          "I love my dogs" + "<br>" + "<br>" +"<br>" +
          "Please help!";
    JLabel dog = new JLabel("<html><div style=\"text-align: center;\">" + text + "</html>");
    dog.setBorder(BorderFactory.createEmptyBorder(5,50,0,50));
    panel.add(dog);

    /***JTextFieldski**/
    JTextField textField = new JTextField(6);
    textField.setBorder(BorderFactory.createEmptyBorder(5,50,0,50));
    textField.setBounds(210,470,100,25);
    panel.add(textField);




    getContentPane().setLayout(new BorderLayout());

    getContentPane().add(textField, BorderLayout.SOUTH);
    getContentPane().add(dog, BorderLayout.CENTER);
    getContentPane().add(panel, BorderLayout.SOUTH);
    getContentPane().add(title, BorderLayout.NORTH);
}
}

【问题讨论】:

  • 你被添加textField然后panelBorderLayout.SOUTH区域,只有一个(最后一个)JComponent可以占据这个区域,更多信息在Oracle tutorial - How to use Border Layout

标签: java swing user-interface jtextfield jcreator


【解决方案1】:

我认为你昨天接受了我关于使用 EmptyBorder 的建议有点过分了。您正在尝试将其用于像素完美位置。这不是他们的本意。不用担心像素完美定位。就像我昨天说的,学习布局管理器并使用它们。您还可以使用不同的布局管理器将组件包装在面板中并嵌套面板。您不必尝试在一个面板上使所有内容都完美无缺。不同的布局管理器具有不同的特性和品质。

例如,您要做的是向BorderLayout.SOUTH 添加两个不同的组件。 BorderLayout 的问题是每个位置只能有 一个 组件。最后添加的获胜。所以,我们能做些什么?将两者包装在一个面板中怎么样,然后将 that 面板添加到SOUTH :-) 很简单吧?

关于 EmptyBorders,请使用 JLabel api。你可以setHorizontalAlignmentJLabel.CENTER。默认是JLabel.LEADING,所以所有的文本都在左边。如果设置为居中,则居中。

仅供参考,除非您使用空布局,否则 setBounds 将不起作用,我不建议您这样做。你不用它。

这里是重构(使用 NO Empty Borders,让布局管理器完成我们付钱给他们的工作)

import java.awt.BorderLayout;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JTextField;

class ProgDraftMain {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ProgDraft gui = new ProgDraft();
                gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                gui.setResizable(false);
                gui.pack();
                //gui.setSize(1000 , 1000);
                gui.setVisible(true);
            }
        });
    }
}

class ProgDraft extends JFrame {

    private ImageIcon image1;
    private JLabel label1;
    private JTextField textField1;

    ProgDraft() {

        /**
         * Main Panel
         */
        JPanel mainPanel = new JPanel(new BorderLayout());
        /**
         * *Title**
         */
        JLabel title = new JLabel("Perimeter Check", JLabel.CENTER);
        Font font = new Font("Gigi", Font.BOLD, 50);
        title.setFont(font);
        mainPanel.add(title, BorderLayout.PAGE_START);   // add title to top

        /**
         * *Info ANtipolo**
         */
        String text = "Ito kunware ang ANtipolo" + "<br>"
                + "Marami ditong landslide areas" + "<br>" + "<br>"
                + "Take care and stay safe!" + "<br>"
                + "I love my dogs" + "<br>" + "<br>" + "<br>"
                + "Please help!";
        JLabel dog = new JLabel("<html><div style=\"text-align: center;\">" + text + "</html>");
        dog.setHorizontalAlignment(JLabel.CENTER);
        mainPanel.add(dog);   //   add dog to center

        /**
         * *Image** ==========>>>>>> Make sure to change the image name back.
         */
        ImageIcon pics = new ImageIcon(getClass().getResource("stackoverflow.png"));

        JLabel logo = new JLabel(pics);
        logo.setHorizontalAlignment(JLabel.CENTER);
        //logo.setBorder(BorderFactory.createEmptyBorder(10, 70, 0, 50));
        logo.setToolTipText("Ito raw kunware yung barangay.");

        /**
         *  Wrapper for text field and icon
         */
        JPanel iconFieldPanel = new JPanel(new BorderLayout());
        JTextField textField = new JTextField(10);    
        iconFieldPanel.add(logo);
        iconFieldPanel.add(textField, BorderLayout.PAGE_END);
        JPanel iconFieldWrapper = new JPanel();
        iconFieldWrapper.add(iconFieldPanel);

        mainPanel.add(iconFieldWrapper, BorderLayout.PAGE_END);  // add icon and field to bottom

        getContentPane().add(mainPanel);
    }
}

请花一些时间查看我为使用布局管理器提供的链接。一次学习一个,掌握每一个的窍门。这是一门艺术,所以它需要时间,就像其他任何事情一样。

【讨论】:

  • 哦,是的,你是昨天回答我问题的人!
  • @peeskilet 我很感激,但我也为没有正确/正确地使用正确的代码而道歉。我是一个学习缓慢的人,同时,我想先看大局,然后再深入细节,但我知道这不是原因,呵呵……我正在阅读你提到的网站,只是我'我收拾东西很慢。无论如何再次感谢你! :-) 这是一个很大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多