2013-05-19 5 views
0

요소 중 하나 (이미지)의 위치 설정에 문제가 있습니다. 화면의 오른쪽 하단에 정렬 할 수 없습니다. 다른 레이아웃을 사용하려고했지만 원하는대로 작동하지 않습니다.JPanel - 위치 지정 요소

아래 보이는 URL은 어떻게 보입니까? 이미지는 오른쪽 아래쪽에 있지만 새로운 BorderLayout이고 바닥에 여분의 공간이 생겨 나머지 부분에 잘 맞습니다. 빨간색 사각형은 이미지를 배치해야하는 위치를 나타냅니다.

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

이 트릭을 수행해야합니다

Image alignment

다음은 내 프로그램의 코드입니다. 두 번째 이미지 (160x160 픽셀)를 PAGE_ENDLINE_END (일부는 BorderLayout 인스턴스)으로 제한하기 위해 더 많은 패널이 필요했습니다.

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에 대해 이야기하지만 코드는 분명한 이유없이 null 레이아웃을 사용합니다. 나는 완전히 혼란 스럽다. 그래서 OP도 잘 맞을 것이다. – camickr

+0

@camickr 무엇 ..? 그 출처를 게시했을 때, 나는 '널 (null)'레이아웃이 없다는 것을 맹세 할 수 있었고, 잘못된 소스를 올렸습니다. 편집을 참조하십시오. –

+1

잘못된 코드를 붙여 넣은 것 같습니다. 널 레이아웃을 사용하는 코드가 있다는 사실에 놀랐습니다. 널 레이아웃에 대한 느낌을 알고있었습니다 :) 아래로 투표가 제거되었습니다. – camickr

3

당신은 더 나은 코드의 구조를 구성해야합니다. 생성자는 일반적으로 클래스 시작 부분에 있습니다.

GUI 구성 요소를 만드는 데 3 가지 방법을 사용하는 대신 하나를 가질 수 있습니다. 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);