0

要素の 1 つ (画像) の位置の設定に問題があります。画面の右下に揃えることができません。さまざまなレイアウトを使用しようとしましたが、思いどおりに動作させることができません。

以下は、現在の様子を表示するための 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();
    }
}
    }
4

2 に答える 2

4

これでうまくいくはずです。2 番目の画像 (160x160px) をいくつかのインスタンスに制限するために、さらにいくつかのパネルが必要PAGE_ENDでしLINE_ENDBorderLayout

メッセージを送る

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(" ");
        }
    }
}
于 2013-05-19T12:28:16.580 に答える
3

コードの構造をよりよく整理する必要があります。コンストラクターは通常、クラスの先頭にあります。

GUI コンポーネントを作成するための 3 つのメソッドを用意する代わりに、おそらく 1 つのメソッドを用意することができます。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);
于 2013-05-19T18:04:14.817 に答える