2012-09-04 7 views
0

JTextField 개체의 높이와 너비를 사용자 지정하고 싶습니다. 나는 너비와 높이를 차원과 int로 전달하면서 setSize 메서드로 시도했다. 그러나 그들 중 누구도 일하는 것 같지 않습니다. 크기 맞춤 설정이 효과적 일 수 있도록 패널이나 일부 필수 메소드 호출과 같은 항목이 누락 되었습니까? 도와주세요. 미리 감사드립니다.스윙 구성 요소의 크기를 설정하는 방법

편집 : 스윙에서 구성 요소의

public class WestPanel extends JPanel{ 
private JLabel dateL; 
private JTextField date; 
public WestPanel(){ 
setBackground(Color.white); 
setLayout(new GridLayout(1,2,0,0)); 
dateL=new JLabel("Date: "); 
date=new JTextField("dd/mm/yyyy"); 
date.setSize(60,10); 
add(dateL); 
add(date); 
//....remaining code....// 
+0

몇 가지 코드를 보여 주면 도움이 될 것입니다. –

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

3

레이아웃 관리자가 귀하의 스윙 구성 요소의 크기를 처리하도록하십시오. 그러나 꼭해야한다면, 해당 속성을 존중하는 레이아웃 관리자와 함께 setPreferredSize을 사용하십시오.

+2

+1. 나는 또한 1) JTextField의 열 수를 설정할 수있다. (이것은 preferredSize를 설정하는 것과 동일하다.) 2) GridLayout은이 경우에 적합하지 않다. (실제로 Layout은 거의 유용하지 않다.) GridBagLayout을 올바르게 구성하면 최상의 결과를 얻을 수 있습니다. 당신을 도울 수있는 다른 LayoutManager가 있습니다 (BorderLayout, FlowLayout, MigLayout, ...)) –

1

크기가 사용하는 레이아웃 매니저의 유형에 따라 달라집니다 : 여기에 코드의 비트가. UI를 완벽하게 제어하려면 Freeflow 레이아웃을 사용할 수 있습니다.

은 여기에 전체 이야기를 읽기 : null로 레이아웃 매니저를 설정할 때 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

3

setSize() 방법에만 작동합니다.

+0

사실, 그것을 고쳤습니다. –

0

JTextField는 실제로 크기를 설정할 수 없습니다. 대신 JTextArea를 사용해야합니다.

+2

setPreferredSize를 사용하여 JTextField 구성 요소의 크기를 설정할 수 있으며 구성 요소 크기를 고려한 GridBagLayout과 같은 레이아웃 관리자를 설정할 수 있습니다. 적절한 JTextField 생성자를 사용하여 JTextField의 너비를 설정할 수 있습니다. 그러나 JTextField의 높이를 두 줄 이상의 텍스트로 변경할 수 없다는 것이 맞습니다. 둘 이상의 행에 대해서는 JTextArea 구성 요소를 사용합니다. –

+1

JTextBox 란 무엇입니까? –

1

의견에서 제안 된 것처럼 텍스트 필드 생성자에서 크기 힌트를 사용하고 적절한 레이아웃 관리자를 사용하십시오.

West Panel

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

public class WestPanel extends JPanel { 

    private JLabel dateL; 
    private JTextField date; 

    public WestPanel(){ 
     setBackground(Color.white); 
     setLayout(new FlowLayout()); 
     dateL=new JLabel("Date: "); 
     date=new JTextField("dd/mm/yyyy",6); 
     add(dateL); 
     add(date); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       JPanel gui = new JPanel(new BorderLayout()); 
       gui.add(new WestPanel(), BorderLayout.LINE_START); 
       gui.setBackground(Color.ORANGE); 
       JOptionPane.showMessageDialog(null, gui); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

'date' JTextField의 열 수에'6'을 어떻게 발견 했습니까? – Stephan

+0

@Stephan Drugs. –

2

나는이 원래 포스터의 질문에 대답을 잘 모르겠지만, 희망 그것은 다른 스윙 개발자들에게 도움이 될 것입니다.

내가 만든 다음 대화 상자에서와 같이 대부분의 사람들은 레이블과 구성 요소가 정렬되기를 원합니다.

enter image description here

나는 레이아웃의 유형을 만드는 데 스윙의 레이아웃 매니저의 GridBagLayout을 사용합니다. 많은 설명보다는이 대화 상자를 만든 코드가 있습니다.

package com.ggl.business.planner.view; 

import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dialog; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.SwingConstants; 

import com.ggl.business.planner.model.BusinessPlannerModel; 
import com.ggl.business.planner.view.extended.EscapeDialog; 
import com.ggl.business.planner.view.extended.JFontChooser; 

public class OptionsDialog { 

    protected static final Insets entryInsets = new Insets(0, 10, 4, 10); 
    protected static final Insets spaceInsets = new Insets(10, 10, 4, 10); 
    protected static final Insets noInsets = new Insets(0, 0, 0, 0); 
    protected static final Insets iconInsets = new Insets(0, 4, 0, 0); 

    protected BusinessPlannerFrame frame; 

    protected BusinessPlannerModel model; 

    protected EscapeDialog dialog; 

    protected JButton activityTextFontButton; 
    protected JButton connectorTextFontButton; 

    protected JSpinner borderSizeSpinner; 

    protected SpinnerNumberModel spinnerNumberModel; 

    protected boolean okPressed; 

    public OptionsDialog(BusinessPlannerModel model, BusinessPlannerFrame frame) { 
     this.model = model; 
     this.frame = frame; 
     createPartControl(); 
    } 

    protected void createPartControl() { 
     dialog = new EscapeDialog(); 
     dialog.setTitle("Business Planner Options"); 
     dialog.setLayout(new GridBagLayout()); 

     int gridy = 0; 
     gridy = createBorderFields(gridy); 
     gridy = createFontFields(gridy); 
     gridy = createButtonFields(gridy); 

     dialog.pack(); 
     dialog.setBounds(dialogBounds()); 
     dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); 
     dialog.setVisible(true); 
    } 

    protected int createBorderFields(int gridy) { 
     JLabel borderSizeLabel = new JLabel("Border size:"); 
     borderSizeLabel.setHorizontalAlignment(SwingConstants.LEFT); 
     addComponent(dialog, borderSizeLabel, 0, gridy, 1, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     spinnerNumberModel = new SpinnerNumberModel(model.getActivityBorder(), 1, 5, 1); 
     borderSizeSpinner = new JSpinner(spinnerNumberModel); 
     addComponent(dialog, borderSizeSpinner, 1, gridy++, 4, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     return gridy; 
    } 

    protected int createFontFields(int gridy) { 
     JLabel boxtextFontLabel = new JLabel("Activity text font:"); 
     boxtextFontLabel.setHorizontalAlignment(SwingConstants.LEFT); 
     addComponent(dialog, boxtextFontLabel, 0, gridy, 1, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     Font font = model.getActivityFont(); 
     activityTextFontButton = new JButton(getFontText(font)); 
     activityTextFontButton.setFont(font); 
     activityTextFontButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       JFontChooser fontChooser = new JFontChooser(); 
       fontChooser.setSelectedFont(model.getActivityFont()); 
       int result = fontChooser.showDialog(dialog); 
       if (result == JFontChooser.OK_OPTION) { 
        Font font = fontChooser.getSelectedFont(); 
        String text = getFontText(font); 
        model.setActivityFont(font); 
        activityTextFontButton.setText(text); 
        activityTextFontButton.setFont(font); 
        JButton dummy = new JButton(text); 
        setButtonSizes(activityTextFontButton, 
          connectorTextFontButton, dummy); 
        dialog.validate(); 
        dialog.pack(); 
       } 
      } 
     }); 
     addComponent(dialog, activityTextFontButton, 1, gridy++, 4, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JLabel connectortextFontLabel = new JLabel("Connector text font:"); 
     connectortextFontLabel.setHorizontalAlignment(SwingConstants.LEFT); 
     addComponent(dialog, connectortextFontLabel, 0, gridy, 1, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     font = model.getConnectorFont(); 
     connectorTextFontButton = new JButton(getFontText(font)); 
     connectorTextFontButton.setFont(font); 
     connectorTextFontButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       JFontChooser fontChooser = new JFontChooser(); 
       fontChooser.setSelectedFont(model.getConnectorFont()); 
       int result = fontChooser.showDialog(dialog); 
       if (result == JFontChooser.OK_OPTION) { 
        Font font = fontChooser.getSelectedFont(); 
        String text = getFontText(font); 
        model.setConnectorFont(font); 
        connectorTextFontButton.setText(text); 
        connectorTextFontButton.setFont(font); 
        JButton dummy = new JButton(text); 
        setButtonSizes(activityTextFontButton, 
          connectorTextFontButton, dummy); 
        dialog.validate(); 
        dialog.pack(); 
       } 
      } 
     }); 
     addComponent(dialog, connectorTextFontButton, 1, gridy++, 4, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     setButtonSizes(activityTextFontButton, connectorTextFontButton); 

     return gridy; 
    } 

    protected String getFontText(Font font) { 
     StringBuilder builder = new StringBuilder(); 

     builder.append(font.getName()); 
     builder.append(", "); 
     builder.append(font.getSize()); 
     builder.append(" points, "); 

     if (font.isPlain()) { 
      builder.append("plain"); 
     } else if (font.isBold()) { 
      builder.append("bold "); 
     } else if (font.isItalic()) { 
      builder.append("italic"); 
     } 

     return builder.toString(); 
    } 

    protected int createButtonFields(int gridy) { 
     JPanel buttondrawingPanel = new JPanel(); 
     buttondrawingPanel.setLayout(new FlowLayout()); 

     JButton okButton = new JButton("OK"); 
     okButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       //TODO Add edits to make sure fields are filled correctly 
       setModel(); 
       okPressed = true; 
       dialog.setVisible(false); 
      }  
     }); 
     dialog.setOkButton(okButton); 
     buttondrawingPanel.add(okButton); 

     JButton cancelButton = new JButton("Cancel"); 
     cancelButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       okPressed = false; 
       dialog.setVisible(false); 
      } 
     }); 
     buttondrawingPanel.add(cancelButton); 

     setButtonSizes(okButton, cancelButton); 

     addComponent(dialog, buttondrawingPanel, 0, gridy++, 5, 1, spaceInsets, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     return gridy; 
    } 

    protected void addComponent(Container container, Component component, 
      int gridx, int gridy, int gridwidth, int gridheight, 
      Insets insets, int anchor, int fill) { 
     GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, 
       gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 0); 
     container.add(component, gbc); 
    } 

    protected void setButtonSizes(JButton ... buttons) { 
     Dimension preferredSize = new Dimension(); 
     for (JButton button : buttons) { 
      Dimension d = button.getPreferredSize(); 
      preferredSize = setLarger(preferredSize, d); 
     } 
     for (JButton button : buttons) { 
      button.setPreferredSize(preferredSize); 
     } 
    } 

    protected Dimension setLarger(Dimension a, Dimension b) { 
     Dimension d = new Dimension(); 
     d.height = Math.max(a.height, b.height); 
     d.width = Math.max(a.width, b.width); 
     return d; 
    } 

    protected void setModel() { 
     model.setActivityBorder(spinnerNumberModel.getNumber().intValue()); 
    } 

    protected Rectangle dialogBounds() { 
     int margin = 200; 
     Rectangle bounds = dialog.getBounds(); 
     Rectangle f = frame.getFrame().getBounds(); 

     bounds.x = f.x + margin; 
     bounds.y = f.y + margin; 

     return bounds; 
    } 

    public boolean isOkPressed() { 
     return okPressed; 
    } 

} 

난 그냥 제가 취소 버튼을 클릭 왼쪽 것처럼, 대화 상자를 닫으려면 Esc 키를 사용할 수 있습니다 연장된다 EscapeDialog 클래스입니다.

메모 할 것은 두 가지입니다. 첫 번째는 addComponent 메소드로 GridBagLayout에 컴포넌트를 추가하는 것을 단순화합니다.

둘째는 setButtonSizes 메서드로 버튼 크기를 모두 동일하게 만듭니다. JTextField 구성 요소가 아닌 JButton 구성 요소 일지라도 JTextField 구성 요소를 같은 크기로 만들려면 비슷한 작업을 수행 할 수 있습니다.

+0

+1, 그런 멋진 게시물. 감사! –

관련 문제