【问题标题】:How to alignment right to left in JFrame/java?如何在 JFrame/java 中从右到左对齐?
【发布时间】:2014-05-18 21:34:04
【问题描述】:

我编写了这段代码,但我无法让它从右到左对齐。 我尝试了几件事,但没有一个有效。 我知道可以通过使用坐标来完成,但我想要一种不需要对每个单词都这样做的方式。我应该如何以正确的方式做到这一点?

代码:

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



public class GUI {
//messages 
public static final String ConnectC_MSG    = "התחבר"    ;
public static final String DisconnectC_MSG = "התנתק"    ;
public static final String ServerLBL_MSG   = "שרת יעד:"  ;
public static final String UsernameLBL_MSG = ":שם משתמש";
public static final String PasswordLBL_MSG = ":סיסמא"   ;
public static final String PortLBL_MSG     = ":פתחה"    ;
//sizes
public static final int SreverTxtfield_Width   = 10;
public static final int UsernameTxtfield_width = 10;
public static final int PasswordTxtfield_width = 10;
public static final int PortTxtfield_width     = 5 ;
public static final int WINDOW_WIDTH  = 800;
public static final int WINDOW_HEIGHT = 200;


static JFrame frame1;
static Container pane;

static JButton btnConnect = new JButton(ConnectC_MSG),
               btiDiscinnect = new JButton(DisconnectC_MSG);
static JLabel lblServer   = new JLabel(ServerLBL_MSG),
              lblUsername = new JLabel(UsernameLBL_MSG),
              lblPassword = new JLabel(PasswordLBL_MSG),
              lblPort     = new JLabel(PortLBL_MSG);

static JTextField txtServer   = new JTextField(SreverTxtfield_Width),
                  txtUsername = new JTextField(UsernameTxtfield_width),
                  txtPort     = new JTextField(PortTxtfield_width);

static JPasswordField txtPassword = new JPasswordField(PasswordTxtfield_width);

static Insets insets;


public static void main(String[] args) {
    frame1 = new JFrame ("הדגמה");
    frame1.setSize(WINDOW_WIDTH,WINDOW_HEIGHT);
    frame1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    pane = frame1.getContentPane();
    pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

    insets = pane.getInsets();
    pane.setLayout(null);   
    pane.add(lblServer);
    pane.add(lblUsername);
    pane.add(lblPassword);
    pane.add(lblPort);
    pane.add(txtServer);
    pane.add(txtUsername);
    pane.add(txtPassword);
    pane.add(txtPort);
    lblServer.setBounds((int)(insets.right),insets.top,
            lblServer.getPreferredSize().width, lblServer.getPreferredSize().height);
    txtServer.setBounds(lblServer.getX()+lblServer.getWidth(), lblServer.getY()+lblServer.getHeight(),
            txtServer.getPreferredSize().width, txtServer.getPreferredSize().height);

    frame1.setVisible(true);

}

}

【问题讨论】:

  • 您在frame1.getContentPane() 中添加了多个组件。那就是拧。使用JPanel 并在其中添加所有组件。最后在框架的内容窗格中添加JPanel
  • 我是新手...新代码需要是什么样的?
  • 请看我的回答。
  • 我应该把完整的代码分享给你吗?你试过我的建议了吗?
  • 我应该如何将其对齐到右侧?

标签: java swing jframe alignment vertical-alignment


【解决方案1】:

试试

  pane = new JPanel();

代替

 pane = frame1.getContentPane();

并删除此行

pane.setLayout(null);   

最后将pane 添加到JFrame

 frame1.getContentPane().add(pane);

【讨论】:

  • 由于我在回答中已经提到的原因,这是一个糟糕的代码。仅仅因为 OP 发布结构不佳的代码并不意味着您应该这样做。这就是为什么我提供了正确执行此操作的 Swing 教程的链接,因此 OP 也可以学习正确执行此操作。
  • 对不起,我帮不了你。你必须先学习。试试@camickr 的建议。
  • 按照@camickr 的建议使用pane = new JPanel( new FlowLayout(FlowLayout.RIGHT) );
  • 为什么我不能像这个人那样使用 contentpane ? dreamincode.net/forums/topic/23017-basic-gui-tutorial-in-java
  • @user3504367,您为什么不能阅读 Swing 教程并学习如何更好地编写代码?我已经告诉过你,代码示例很糟糕,因为所有的静态变量。现在我看到它也使用了空布局,代码示例的情况更糟。
【解决方案2】:

尝试类似:

JPanel panel = new JPanel( new FlowLayout(FlowLayout.RIGHT) );
panel.add(...);
panel.add(...);
...
frame.add(panel, BorderLayout.NORTH);

组件将与框架的骑行侧对齐。

另外,去掉所有的静态变量。这不是编写课程的方式。

阅读 How to Use Flow Layout 上的 Swing 教程部分以获取更多信息和示例。 If 将向您展示一种更好的方式来构建您的类,而无需所有静态内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2014-06-03
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多