2012-05-11 23 views
5

Ben java için tam olarak yeni değilim (bunu bir yıldır kullanıyordum) ama bu benim ilk adımı atıyor. Bir kerede hem soket hem de salıncak öğrenmek için çok basit bir sohbet istemcisi yapmaya çalışıyorum. Sorum şu: "Panellerimi doğru şekilde hizalamak için ne yapmalıyım?" Çok fazla şey denedim (kodumda olmasa da). Genellikle böyle bir şeyi kendi başıma yapıyorum, ama yardım istemek zorunda olduğum noktaya geldim. Wieghtx'i değiştirmem gerek mi? İstemcinin nasıl görünmesini istediğim, bunun gibi bir şey. GridBagLayout ile panelleri hizalama

enter image description here

Bu

şu anda böyle görünüyor.

enter image description here

İşte benim kodudur.

package com.client.core; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class Window extends JFrame{ 

private int screenWidth = 800; 
private int screenHeight = 600; 

public Window(){ 

    //Initial Setup 
    super("NAMEHERE - Chat Client Alpha v0.0.1"); 
    setResizable(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(screenWidth,screenHeight); 
    GridBagConstraints c = new GridBagConstraints(); 

    //Main Panel 
    JPanel window = new JPanel(); 
    window.setLayout(new GridBagLayout()); 
    window.setBackground(Color.black); 

    //Panels 
    JPanel display = new JPanel(); 
    JPanel chat = new JPanel(); 
    chat.setLayout(new GridBagLayout()); 
    JPanel users = new JPanel(); 


    display.setBackground(Color.blue); 
    c.gridx = 0; 
    c.gridy = 0; 
    c.insets= new Insets(5,5,5,5); 
    window.add(display, c); 

    chat.setBackground(Color.red); 
    c.gridx = 0; 
    c.gridy = 3; 
    c.gridheight = 2; 
    c.gridwidth = 1; 
    c.insets= new Insets(5,5,5,5); 
    window.add(chat, c); 

    users.setBackground(Color.green); 
    c.gridx = 2; 
    c.gridy = 0; 
    c.insets= new Insets(5,5,5,5); 
    window.add(users, c); 

    //Buttons 


    //Text fields 
    JTextArea text = new JTextArea("DEREADFADSFEWFASDFSADFASDF"); 
    c.gridx = 0; 
    c.gridy = 0; 
    chat.add(text); 
    JTextField input = new JTextField("type here to chat", 50); 
    c.gridx = 0; 
    c.gridy = 1; 
    c.insets= new Insets(5,5,5,5); 
    chat.add(input); 


    add(window); 


} 

static class ActLis implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 

    } 

} 
} 
+1

gridBagLayout özellikle Swing yeni insanlar için, elle yazmayı oldukça zordur kodudur. Bu düzeni, BorderLayout'un kullanımıyla, sol tarafta üç sol taraftaki bileşeni içeren bir panele sahip olacak şekilde çok daha kolay bir şekilde gerçekleştirebilirsiniz. – Vulcan

+0

GridBagLayout öğesinin, özellikle de sallanmaya yeni iseniz, aşırı derecede karmaşık olduğunu kabul ettiniz. MigLayout veya JGoodies FormLayout kullanmanızı öneririz. Karmaşık düzenlere izin verin, ancak panellerin nasıl düzenleneceği konusunda daha net bir şekilde anlaşın. –

+0

İlgili: http://stackoverflow.com/questions/10333559/gridbaglayout-jscrollpane-how-to-reduce-row-height – assylias

cevap

3

yapmanız ve muhtemelen bir çıkış olarak böyle bir şey isteseydim o zaman GridBagLayout

+0

Pekala, BorderLayout'u öneren ikinci kişisin, bu yüzden bir deneyeceğim. Teşekkür ederim! – cgasser

+0

@Robin: Bir kez BorderLayout ile denedim, bazen ne olur, JTextArea başlangıçta boş olacağından, çok daha az spece kaplar, ki bu bazen gözlere hitap etmiyor, yani çok fazla Nesting var. İstenilen sonuca ulaşmak için bu nedenle bazen GridBagLayout bu gibi durumlar için kullanışlı hale gelir. +1 olsa da deneyin :-) –

+0

@nIcEcOw Tipik olarak bir "JTextArea" bir scrollpane içerisine alınacak ve daha sonra satır/sütun sayısını manuel olarak ayarlayacaksınız. Ve eğer scrollpane'i merkeze yerleştirirseniz, daha sonra çerçeveyi yeniden boyutlandırarak büyütebilirsiniz. – Robin

3

karıştırmasını istenen bir sonuç daha basit

JPanel somethingHere = ...; 
JPanel chat = ...; 
JPanel userList = ...; 

JPanel leftPanel = new JPanel(new BorderLayout()); 
leftPanel.add(somethingHere, BorderLayout.CENTER); 
leftPanel.add(chat, BorderLayout.SOUTH); 

JPanel total = new JPanel(new BorderLayout()); 
total.add(leftPanel, BorderLayout.CENTER); 
total.add(userList, BorderLayout.EAST); 

Way verir ne olabilir:

MESSENGER WINDOW

Bu c gazel örneği, son ButtonPanel kaldırabilirsiniz gerçi bunu gerekmiyorsa:

İşte
package to.uk.gagandeepbali.swing.messenger.gui; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Color; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.JTextField; 

public class ChatPanel extends JPanel 
{ 
    private JButton backButton; 
    private JButton exitButton; 
    private JButton sendButton; 

    private JTextPane chatPane; 
    private JTextPane namePane; 
    private JTextField chatField; 

    private GridBagConstraints gbc; 

    private final int GAP = 10; 
    private final int SMALLGAP = 1; 

    public ChatPanel() 
    { 
     gbc = new GridBagConstraints(); 
    } 

    protected void createGUI() 
    { 
     setOpaque(true); 
     setBackground(Color.WHITE); 
     setLayout(new BorderLayout(5, 5)); 

     JPanel centerPanel = new JPanel(); 
     centerPanel.setOpaque(true); 
     centerPanel.setBackground(Color.WHITE); 
     centerPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, 0, GAP)); 
     centerPanel.setLayout(new GridBagLayout()); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.gridwidth = 5; 
     gbc.weightx = 0.8; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
     chatPane = new JTextPane(); 
     JScrollPane scrollerChat = new JScrollPane(); 
     scrollerChat.setBorder(BorderFactory.createTitledBorder("Chat")); 
     scrollerChat.setViewportView(chatPane); 
     centerPanel.add(scrollerChat, gbc); 

     gbc.gridx = 5; 
     gbc.gridwidth = 2; 
     gbc.weightx = 0.2; 
     namePane = new JTextPane(); 
     JScrollPane scrollerName = new JScrollPane(namePane); 
     scrollerName.setBorder(BorderFactory.createTitledBorder("Names")); 
     centerPanel.add(scrollerName, gbc); 

     gbc.gridx = 0; 
     gbc.gridy = 5; 
     gbc.gridwidth = 5; 
     gbc.weightx = 0.8; 
     gbc.weighty = 0.1; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     chatField = new JTextField(); 
     chatField.setOpaque(true); 
     chatField.setBorder(BorderFactory.createCompoundBorder(
       BorderFactory.createTitledBorder("") 
       , BorderFactory.createEmptyBorder(SMALLGAP, SMALLGAP, SMALLGAP, SMALLGAP))); 
     centerPanel.add(chatField, gbc); 

     gbc.gridx = 5; 
     gbc.gridwidth = 2; 
     gbc.weightx = 0.2; 
     sendButton = new JButton("Send"); 
     sendButton.setBorder(BorderFactory.createTitledBorder("")); 
     centerPanel.add(sendButton, gbc);  

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setOpaque(true); 
     bottomPanel.setBackground(Color.WHITE); 
     bottomPanel.setBorder(
       BorderFactory.createTitledBorder("")); 
     bottomPanel.setLayout(new BorderLayout()); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setOpaque(true); 
     buttonPanel.setBackground(Color.WHITE); 
     buttonPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, 0, GAP)); 
     backButton = new JButton("Back"); 
     exitButton = new JButton("Exit"); 
     buttonPanel.add(backButton); 
     buttonPanel.add(exitButton); 
     bottomPanel.add(buttonPanel, BorderLayout.CENTER); 

     add(centerPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    public JTextPane getChatPane() 
    { 
     return chatPane; 
    } 

    public JTextPane getNamePane() 
    { 
     return namePane; 
    } 

    public JTextField getChatField() 
    { 
     return chatField; 
    } 

    public JButton getExitButton() 
    { 
     return exitButton; 
    } 

    public JButton getBackButton() 
    { 
     return backButton; 
    } 

    public JButton getSendButton() 
    { 
     return sendButton; 
    } 
} 
+1

Yardım için teşekkürler ! Ne istediğimi BoxLayout ile karıştırıyordum. – cgasser

+1

@Zexanima: EN GÜZEL HOŞGELDİNİZ ve SÜREKLİ TUTULAMAZ :-). Sevindim sevindim :-) –

1

Ben şimdiye kadar çıktı budur. Kırmızı kutu, LWJGL ile basit bir 2D avatar arayüzü eklemeyi planladığım yerdir. İşte

enter image description here

o

package com.client.core; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 


public class Window extends JFrame{ 

private int screenWidth = 800; 
private int screenHeight = 600; 

public Window(){ 

    //Initial Setup 
    super("NAMEHERE - Chat Client Alpha v0.0.1"); 
    setResizable(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(screenWidth,screenHeight); 


    //Main Panels 
    JPanel window = new JPanel(new BorderLayout()); 
    JPanel center = new JPanel(new BorderLayout()); 
    JPanel right = new JPanel(new BorderLayout()); 


    //Panels 
    JPanel display = new JPanel(new BorderLayout()); 
    display.setBackground(Color.red); 
    JPanel chat = new JPanel(); 
    chat.setLayout(new BoxLayout(chat, BoxLayout.Y_AXIS)); 
    chat.setBackground(Color.blue); 
    JPanel users = new JPanel(new BorderLayout()); 
    users.setBackground(Color.green); 


    //TextFields 
    JTextArea chatBox = new JTextArea("Welcome to the chat!", 7,50); 
    chatBox.setEditable(false); 
    JTextField chatWrite = new JTextField(); 
    JScrollPane userList = new JScrollPane(); 
    JTextField userSearch = new JTextField(10); 
    userList.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    users.add(userList); 
    users.add(userSearch, BorderLayout.NORTH); 
    chat.add(chatBox); 
    chat.add(chatWrite); 
    chat.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); 

    //Menu bar 
    JMenuBar menu = new JMenuBar(); 
     JMenu file = new JMenu("File"); 
      JMenuItem exit = new JMenuItem("Exit"); 
      JMenuItem ipconnect = new JMenuItem("Connect to IP"); 
    file.add(ipconnect); 
    file.add(exit); 
    menu.add(file); 


    //Main window adding 
    right.add(users); 
    center.add(display, BorderLayout.CENTER); 
    center.add(chat, BorderLayout.SOUTH); 
    window.add(center, BorderLayout.CENTER); 
    window.add(right, BorderLayout.EAST); 
    window.add(menu, BorderLayout.NORTH); 
    add(window); 




    //Listeners 
    chatWrite.addKeyListener(new KeyLis()); 
    ipconnect.addActionListener(new ActLis()); 
    exit.addActionListener(new ActLis()); 
} 







static class KeyLis implements KeyListener{ 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode() == KeyEvent.VK_ENTER){ 
      System.out.println("Message recieved."); 
     } 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 



} 

static class ActLis implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    if(e.getActionCommand() == "Exit"){ 
     System.exit(0); 
    } else if(e.getActionCommand() == "Connect to IP"){ 
     System.out.println("Connecting...."); 
     JFrame frameip = new JFrame(); 
     JPanel panelip = new JPanel(); 
     JButton buttonip = new JButton("Hello"); 
     frameip.add(panelip); 
     panelip.add(buttonip); 
     JDialog ippop = new JDialog(frameip, "Enter IP", false); 
    } 


    } 
} 
} 
+0

Ahha, bu iyi :-), bu konuda ellerimi denememe izin ver, eğer GridBag ile bunu yapabilseydim, bilmene izin vereceğim, bu :-) –

+0

Kendinde iyi görünüyor GridBagLayout için gerek yok sanırım :-) Çok iyi –