2013-05-19 104 views
0

我對設置其中一個元素(圖像)的位置有問題。我無法將其對齊到屏幕的右下角。我試圖使用不同的佈局,但我無法使它像我想要的那樣工作。JPanel - 定位元素

以下是查看現在外觀的網址。圖像位於右下方,但是它是一個新的BorderLayout,它在底部創建了額外的空間,所以我寧願將其與其餘部分配合。紅色方塊顯示應放置圖像的位置。

Image alignment

下面是我的程序的代碼:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 

public class Server extends JFrame implements ActionListener{ 
public static final int PORT = 8060; 
private JButton reset, exit; 
private JEditorPane messages; 
private ImageIcon logo = new ImageIcon("C:src\\images\\logo.png"); 
private JLabel logoSpot; 
Container box = getContentPane(); 
public static void main(String args[]){ 
    new Server().Networking(); 
} 

public void makeMenu(){ 
    JPanel menu = new JPanel(); 
    reset = new JButton("Reset messages"); 
    exit = new JButton("Exit"); 
    menu.add(reset); 
    menu.add(exit); 
    reset.addActionListener(this); 
    exit.addActionListener(this); 
    box.add(menu, BorderLayout.EAST); 
} 
public void setLogo(){ 
    JPanel logoSpace = new JPanel(new BorderLayout()); 
    logoSpot= new JLabel(); 
    logoSpot.setIcon(logo); 
    logoSpace.add(logoSpot, BorderLayout.EAST); 
    box.add(logoSpace, BorderLayout.SOUTH); 
} 
public void makeScreen(){ 
    JPanel screen = new JPanel(); 
    messages = new JEditorPane(); 
    messages.setPreferredSize(new Dimension(800,590)); 
    screen.add(messages); 
    box.add(screen, BorderLayout.WEST); 
    } 
public Server(){ 
    makeMenu(); 
    makeScreen(); 
    setLogo(); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    setSize(1024, 680); 
    setTitle("Emergency system"); 
} 
@Override 
public void actionPerformed(ActionEvent e){ 
    if(e.getSource() == exit){ 
     super.dispose(); 
    } 
    if(e.getSource() == reset){ 
     messages.setText(" "); 
    } 
} 
public void Networking(){ 
    String received=" "; 
    try{ 
     ServerSocket ss = new ServerSocket(PORT); 
     while(true){ 
      Socket sock = ss.accept(); 
      BufferedReader in = 
        new BufferedReader(new InputStreamReader(
          sock.getInputStream())); 
      received = in.readLine(); 
      messages.setText(messages.getText() + received + 
        " \n\n"); 
      OutputStreamWriter out = 
        new OutputStreamWriter(sock.getOutputStream()); 
      BufferedWriter bw = new BufferedWriter(out); 
      bw.write(received); 
      bw.flush(); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
    } 
+0

1)爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 2)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 –

回答

4

這應該做的伎倆。它只需要一些面板將第二張圖像(160x160px)約束爲BorderLayout實例的PAGE_ENDLINE_END

Send_Messages

import java.awt.*; 
import java.awt.image.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 

public class Server extends JFrame implements ActionListener{ 

    public static final int PORT = 8060; 
    private JButton reset, exit; 
    private JEditorPane messages; 
    private ImageIcon logo = new ImageIcon(
     new BufferedImage(140,140,BufferedImage.TYPE_INT_RGB)); 
    private JLabel logoSpot; 
    Container box = getContentPane(); 

    public static void main(String args[]){ 
     new Server(); 
    } 

    public void makeMenu(){ 
     JPanel menu = new JPanel(new BorderLayout(5,5)); 

     menu.setBackground(Color.RED); 
     reset = new JButton("Reset messages"); 
     exit = new JButton("Exit"); 

     JPanel buttons = new JPanel(); 
     buttons.setBackground(Color.GREEN); 
     menu.add(buttons, BorderLayout.PAGE_START); 
     buttons.add(reset); 
     buttons.add(exit); 
     reset.addActionListener(this); 
     exit.addActionListener(this); 

     JLabel l = new JLabel(new ImageIcon(new BufferedImage(
      160,160,BufferedImage.TYPE_INT_RGB))); 
     JPanel forceRight = new JPanel(new BorderLayout()); 
     forceRight.add(l, BorderLayout.LINE_END); 
     forceRight.setBackground(Color.BLUE); 

     menu.add(forceRight, BorderLayout.PAGE_END); 

     box.add(menu, BorderLayout.EAST); 
    } 

    public void setLogo(){ 
     JPanel logoSpace = new JPanel(new BorderLayout()); 
     logoSpot= new JLabel(); 
     logoSpot.setIcon(logo); 
     logoSpace.add(logoSpot, BorderLayout.EAST); 
     box.add(logoSpace, BorderLayout.SOUTH); 
    } 

    public void makeScreen(){ 
     JPanel screen = new JPanel(); 
     screen.setBackground(Color.YELLOW); 
     messages = new JEditorPane(); 
     messages.setPreferredSize(new Dimension(800,590)); 
     screen.add(messages); 
     box.add(screen, BorderLayout.WEST); 
    } 

    public Server(){ 
     makeMenu(); 
     makeScreen(); 
     setLogo(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setSize(1024, 680); 
     setTitle("Emergency system"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     if(e.getSource() == exit){ 
      super.dispose(); 
     } 
     if(e.getSource() == reset){ 
      messages.setText(" "); 
     } 
    } 
} 
+0

-1,不知道我理解這個例子。你的評論談到了一個BorderLayout,但是這個代碼沒有明顯的原因使用了一個空佈局。我完全困惑,所以我猜想OP也是如此。 – camickr

+0

@camickr什麼..?當我發佈該源時,我可以發誓沒有'null'佈局,(貼着額頭)我發佈了錯誤的源代碼。看編輯.. –

+1

圖你粘貼了錯誤的代碼。我很驚訝,你甚至有代碼使用空佈局,知道你對null佈局的感覺:)刪除投票。 – camickr

3

你應該組織你的代碼的結構更好。構造函數通常在類的開始處找到。

而不是有3種方法來創建GUI組件,你可能有一個。您不需要使用getContentPane()方法。當您使用JFrame的add(...)方法時,組件將添加到內容窗格中。我也會使用JTextArea來顯示消息。 JEdtitorPane只能用於HTML。您還應該將文本區域添加到JScrollPane,以便在添加更多消息時出現滾動條。

所以基本代碼將是這樣的:

JTextArea textArea = new JTextArea(20, 50); 
JScrollPane scrollPane = new JScrollPane(textArea); 
add(scrollPane, BorderLayout.CENTER); 

JPanel east = new JPanel(new BorderLayout()); 
east.add(menuPanel, BorderLayout.NORTH); 
east.add(logo, BorderLayout.SOUTH); 

add(east, BorderLayout.EAST);