2014-09-03 47 views
2

所以我有一个关于我的JTextField的问题。 我想要做的是把JTextField框下面的图片(某个镇的地图)。 是的,我使用了.setBounds,它已经在图像下面了,但是我想要发生的是如果我做.pack();它必须仍然可见。不幸的是,事实并非如此。JTextField永久位置/位置?

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

最后,我希望图片下方的JTextField在打包时仍然必须可见。

请帮忙。谢谢。 我仍然在发现关于GUI的新事物。 对不起noob问题。

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); 
} 
} 
+2

您将'textField'和'panel'添加到'BorderLayout.SOUTH'区域,只有一个(最后一个)'JComponent'可以占用这个区域,'Oracle教程 - 如何使用Border Layout' – mKorbel 2014-09-03 12:51:00

回答

2

我想你昨天就使用EmptyBorder有点过分了。您正试图将其用于像素完美位置。这不是他们的意思。不要担心像素的完美定位。就像我昨天说的,学习布局管理器并利用它们。您还可以用不同的布局管理器将面板中的组件包装起来并嵌套面板。您不必尝试在一个面板上获得完美的一切。不同的布局管理者具有不同的特征和质量。

例如你要做的是将两个不同的组件添加到BorderLayout.SOUTH。关于BorderLayout的事情是每个位置只能有一个组件。最后一个增加了胜利。所以,我们能做些什么?如何在面板中包装这两个,然后将面板添加到SOUTH :-)容易吧?

同样在EmptyBorders方面,请使用JLabel api。您可以setHorizontalAlignmentJLabel.CENTER。默认是JLabel.LEADING,所以所有的文字都在左边。如果将其设置为中心,则它将居中。

也只是供参考,setBounds不会工作,除非你使用空布局,我建议。你不用它。

这里是重构(使用没有空边框,让布局管理器做的工作,我们付给他们这样做)

enter image description here

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); 
    } 
} 

而且pleeease做需要一定的时间去通过链接我提供了使用布局管理器。一次研究一个,并掌握每一个。这是一门艺术,所以需要时间,就像其他任何东西一样。

+0

噢,是的,你是昨天回答我问题的人! – Naomi 2014-09-03 14:19:49

+0

@peeskilet我很感激,但我也很抱歉没有正确使用正确的代码。我是一个缓慢的学习者,同时,我想在详细讨论之前先看到大局,但我知道这不是胡胡的理由......我正在阅读你介绍给我的网站,捡起东西很慢。无论如何,再次感谢你! :-)这是一个很大的帮助。 – Naomi 2014-09-03 14:25:31