2017-06-20 39 views
-2

圖片我創建的食品標籤使用下面的代碼對齊的TextView和同一行JAVA

JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
addIt(tabbedPane, "Foods"); 
addIt1(tabbedPane, "Drinks"); 
addIt1(tabbedPane, "Desserts"); 
tabbedPane.setBounds(10, 11, 400, 450); 
frame.getContentPane().add(tabbedPane); 

這裏ADDIT方法

static void addIt(JTabbedPane tabbedPane, String text) throws IOException { 
    JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    JTextField textField = new JTextField(2); 

    BufferedImage myPicture = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\MedSalad.png")); 
    Image scaled = myPicture.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel = new JLabel("Salad",new ImageIcon(scaled),JLabel.CENTER); 
    picLabel.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField1 = new JTextField(2); 
    BufferedImage myPicture1 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\JapanesePanNoodles.png")); 
    Image scaled1 = myPicture1.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel1 = new JLabel("Japanese Noodles",new ImageIcon(scaled1),JLabel.CENTER); 
    picLabel1.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel1.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField2 = new JTextField(2); 
    BufferedImage myPicture2 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\Spaghetti.png")); 
    Image scaled2 = myPicture2.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel2 = new JLabel("Spaghetti",new ImageIcon(scaled2),JLabel.CENTER); 
    picLabel2.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel2.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField3 = new JTextField(2); 
    BufferedImage myPicture3 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\PadThai.png")); 
    Image scaled3 = myPicture3.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel3 = new JLabel("Spaghetti Meat Balls",new ImageIcon(scaled3),JLabel.CENTER); 
    picLabel3.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel3.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField4 = new JTextField(2); 
    BufferedImage myPicture4 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\RamenNoodles.png")); 
    Image scaled4 = myPicture4.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel4 = new JLabel("Noodles",new ImageIcon(scaled4),JLabel.CENTER); 
    picLabel4.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel4.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField5 = new JTextField(2); 
    BufferedImage myPicture5 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\SpaghettiAndMeatBalls.png")); 
    Image scaled5 = myPicture5.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel5 = new JLabel("Kids Spaghetti",new ImageIcon(scaled5),JLabel.CENTER); 
    picLabel5.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel5.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField6 = new JTextField(2); 
    BufferedImage myPicture6 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\chickenRice.jpg")); 
    Image scaled6 = myPicture6.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel6 = new JLabel("Chicken Rice",new ImageIcon(scaled6),JLabel.CENTER); 
    picLabel6.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel6.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField7 = new JTextField(2); 
    BufferedImage myPicture7 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\thaiFood.jpeg")); 
    Image scaled7 = myPicture7.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel7 = new JLabel("Thai Food",new ImageIcon(scaled7),JLabel.CENTER); 
    picLabel7.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel7.setVerticalTextPosition(JLabel.BOTTOM); 

    JTextField textField8 = new JTextField(2); 
    BufferedImage myPicture8 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\vietnamFood.jpg")); 
    Image scaled8 = myPicture8.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
    JLabel picLabel8 = new JLabel("Vietnam Food",new ImageIcon(scaled8),JLabel.CENTER); 
    picLabel8.setHorizontalTextPosition(JLabel.CENTER); 
    picLabel8.setVerticalTextPosition(JLabel.BOTTOM); 
    panel.add(picLabel); 
    panel.add(textField); 
    panel.add(picLabel1); 
    panel.add(textField1); 
    panel.add(picLabel2); 
    panel.add(textField2); 
    panel.add(picLabel3); 
    panel.add(textField3); 
    panel.add(picLabel4); 
    panel.add(textField4); 
    panel.add(picLabel5); 
    panel.add(textField5); 
    panel.add(picLabel6); 
    panel.add(textField6); 
    panel.add(picLabel7); 
    panel.add(textField7); 
    panel.add(picLabel8); 
    panel.add(textField8); 
    tabbedPane.addTab(text, panel); 
} 

這裏食品標籤的屏幕截圖

enter image description here

MainClass

public class FoodOrdering { 

    private JFrame frame; 
    private JTextField textField; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        FoodOrdering window = new FoodOrdering(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public FoodOrdering() throws IOException { 
     initialize(); 
    } 

    private void initialize() throws IOException { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 700, 550); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 
     frame.setLocationRelativeTo(null); 

     JLabel lblFoodOrdered = new JLabel("Food Ordered"); 
     lblFoodOrdered.setBounds(529, 11, 81, 14); 
     frame.getContentPane().add(lblFoodOrdered); 

     TextArea textArea = new TextArea(); 
     textArea.setBounds(462, 31, 199, 275); 
     frame.getContentPane().add(textArea); 

     JLabel lblTotal = new JLabel("Total : "); 
     lblTotal.setBounds(519, 315, 46, 14); 
     frame.getContentPane().add(lblTotal); 

     textField = new JTextField(); 
     textField.setBounds(575, 312, 86, 20); 
     frame.getContentPane().add(textField); 
     textField.setColumns(10); 

     JButton btnOrder = new JButton("Order"); 
     btnOrder.setBounds(521, 352, 89, 23); 
     frame.getContentPane().add(btnOrder); 

     JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
     addIt(tabbedPane, "Foods"); 
     addIt1(tabbedPane, "Drinks"); 
     addIt1(tabbedPane, "Desserts"); 
     tabbedPane.setBounds(23, 11, 400, 450); 
     frame.getContentPane().add(tabbedPane); 
    } 

我該如何調整的pictureJTextField在同一條直線?

回答

3

我沒有圖片測試,還有從我在看到它,你可以嘗試(按優先順序排列)

  • 使用GridBagLayout代替FlowLayout是在問題沒有有效MCVE,但是這你正在使用,這將有助於將你的圖像放在一個網格中並將它們對齊。

  • 使用GridLayout這將使您的圖像和JTextField s相同的大小,並將它們放在一個大小相同的網格,每個組件。

  • 調整圖片大小是一樣的大小,得到他們的getScaledInstance(...)

順便說一句,這tabbedPane.setBounds(10, 11, 400, 450);表明,在你的代碼的某些時候,你使用null佈局,你應該知道之前null layout is evil,因此它的用途是frowned upon。如果你沒有在任何地方使用null佈局(我們無法知道,因爲我們沒有問題中的代碼),那麼,該行是必要的。

此外,您可以通過包裝都像這樣相同的功能改進代碼:

JTextField textField1 = new JTextField(2); 
BufferedImage myPicture1 = ImageIO.read(new File("C:\\Users\\tony\\Desktop\\JapanesePanNoodles.png")); 
Image scaled1 = myPicture1.getScaledInstance(80,95,Image.SCALE_SMOOTH); 
JLabel picLabel1 = new JLabel("Japanese Noodles",new ImageIcon(scaled1),JLabel.CENTER); 
picLabel1.setHorizontalTextPosition(JLabel.CENTER); 
picLabel1.setVerticalTextPosition(JLabel.BOTTOM); 

那裏接收圖像名稱和標籤文本的方法中,作爲代碼的其餘部分是相同的其他的,然後你可以在循環中調用這個方法,這可以真正改善你編寫的代碼,易讀性和簡單性。


從我的上述建議,您可以使用GridBagConstraints到地方,你希望你的元素使用GridBagLayout,避免使用null佈局:

frame.getContentPane().setLayout(null); //COMPLETELY WRONG!!!!!! 

在這個例子中,我用了兩張圖片不同的尺寸,所以,你可以看到,即使是這樣,你的領域將保持相同的大小。

下面的代碼是一個MCVE,您發佈的一個不是(我有你的很驚訝幾乎3K代表不知道如何作出正確的MCVE)

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class FoodMenu { 
    private JFrame frame; 
    private JPanel pane; 
    private GridBagConstraints gbc; 
    private JLabel[] foodLabel; 
    private JTextField[] qtyField; 

    private static final int ELEMENTS = 9; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new FoodMenu().createAndShowGui()); 
    } 

    private void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 

     pane = new JPanel(); 
     pane.setLayout(new GridBagLayout()); 

     gbc = new GridBagConstraints(); 

     foodLabel = new JLabel[ELEMENTS]; 
     qtyField = new JTextField[ELEMENTS]; 

     ImageIcon icon = null, icon2 = null; 
     try { 
      URL url = new URL("https://image.flaticon.com/icons/png/128/148/148836.png"); 
      URL url2 = new URL("https://i.stack.imgur.com/IucNt.png"); 
      BufferedImage img = ImageIO.read(url); 
      icon = new ImageIcon(img); 
      BufferedImage img2 = ImageIO.read(url2); 
      icon2 = new ImageIcon(img2); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     for (int i = 0; i < ELEMENTS; i++) { 
      foodLabel[i] = new JLabel(i % 2 == 0 ? icon : icon2); 
      qtyField[i] = new JTextField(3); 
     } 

     gbc.gridx = 0; 
     for (int i = 0; i < ELEMENTS; i++) { 
      if (i % 3 == 0) { 
       gbc.gridy++; 
       gbc.gridx = 0; 
      } 
      pane.add(foodLabel[i], gbc); 

      gbc.gridx++; 
      pane.add(qtyField[i], gbc); 
      gbc.gridx++; 
     } 

     frame.add(pane); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

enter image description here

但是,如何顯示食物圖像下方的食物標籤?

更改for循環如下

gbc.gridx = 0; 
for (int i = 0; i < ELEMENTS; i++) { 
    if (i % 3 == 0) { 
     gbc.gridy += 2; 
     gbc.gridx = 0; 
    } 
    pane.add(foodLabel[i], gbc); 
    gbc.gridy++; 
    pane.add(qtyField[i], gbc); 
    gbc.gridx++; 
    gbc.gridy--; 
} 
+0

你的意思是我需要使用網格佈局和GridBagLayout的? –

+0

是的,而不是'FlowLayout' :) – Frakcool

+0

不是真的知道如何將圖標存儲在數組中... –