2013-05-19 108 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);