【问题标题】:Is there a way to make JTextField for my address bar larger and curvier有没有办法让我的地址栏的 JTextField 更大更弯曲
【发布时间】:2014-07-19 16:38:11
【问题描述】:

我正在制作一个浏览器只是为了练习我的Java技能,有没有办法让我的地址栏是一个JTextField,更大而不是swing的默认值,也更弯曲。这是我的代码。

//imports of the GUI 
//import java.awt.*;
 //import java.awt.event.*;
 //import javax.swing.*;
 //import javax.swing.event.*;
 //import javax.swing.text.*;
 //import javax.swing.GroupLayout.*;

  //extends is to use the GUI class 
public class ReadFile extends JFrame {
private JTextField addressBar; //to have the address bar 
private JEditorPane display;  //display the html information
 //constructor 

//Set the frame icon to an image loaded from a file.
public ReadFile() {
    super("SPHERE"); //name of the browser


    addressBar = new JTextField("enter an URL", 50); //inside the URL 
    addressBar.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){
                loadCrap(event.getActionCommand());
                }
}

    );
    add(addressBar, BorderLayout.NORTH);



    display = new JEditorPane();
    display.setEditable(false);
    display.addHyperlinkListener(
            new HyperlinkListener(){
            public void hyperlinkUpdate(HyperlinkEvent event){
            if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED){
            loadCrap(event.getURL().toString());

            }
            }
            } 
    );
    add(new JScrollPane(display), BorderLayout.CENTER);
    setSize(600,200);
    setVisible(true);

   }
  //load crap to display on the screen
    private void loadCrap(String userText){
    try{display.setPage(userText);
    addressBar.setText(userText);}catch(Exception e){System.out.println("crap!")}
    }



    } 

我想制作一个真正可用的浏览器,就像我想显示 html 和它的 CSS 页面一样,我还需要学习什么才能使它工作。

【问题讨论】:

  • “曲线”?请详细说明。
  • “我还需要学习什么才能完成这项工作” Swing 对 CSS 和 HTML 的支持有限,您应该研究JEditorPane 的替代解决方案。您可能还想对 SwingLabs 进行一些研究,SwingX PromptSupport
  • “我正在制作浏览器只是为了练习我的 Java 技能”
  • 如果你看一下 chromes 的多功能框,它的边缘是弯曲的。这就是我的意思。
  • 好的,感谢任何回答我问题的人,我真的很感激。我学到了很多新信息。

标签: java javascript css swing jframe


【解决方案1】:

几乎所有这些都归结为处理边框,但这可能不会产生您之后的结果,例如......

JTextField field = new JTextField(10);
field.setBorder(new CompoundBorder(field.getBorder(), new EmptyBorder(10, 0, 10, 0)));

创建圆角边框更难......

还有曲线

有几种方法可以实现,例如,您可以创建自己的Border,例如...

public class RoundedBorder extends AbstractBorder {

    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        insets.left = 5;
        insets.right = 5;
        insets.top = 5;
        insets.bottom = 5;

        return insets;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        Graphics2D g2d = (Graphics2D) g.create();
        RoundRectangle2D shape = new RoundRectangle2D.Float(0, 0, width - 1, height - 1, 20, 20);
        g2d.setColor(Color.BLACK);
        g2d.draw(shape);
        g2d.dispose();
    }

}

然后将其应用到您的领域...

field.setBorder(new CompoundBorder(new RoundedBorder(), new EmptyBorder(10, 0, 10, 0)));

这会产生类似...

但我不喜欢这样,因为如果你仔细观察,边框外的区域仍然是绘制的......你可以让边框填充这个区域,但我喜欢能够为组件提供透明功能,所以你可以伪造它......

基本上,它的作用是创建一个自定义组件,可以在字段周围绘制,但是,因为它可以更好地控制绘制过程,还可以提供边框外的透明效果...

public class FakeRoundedBorder extends JPanel {

    private JTextField field;

    public FakeRoundedBorder(JTextField field) {
        this.field = field;
        setBorder(new EmptyBorder(5, 5, 5, 5));
        field.setBorder(new EmptyBorder(10, 0, 10, 0));
        setLayout(new BorderLayout());
        add(field);
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        RoundRectangle2D shape = new RoundRectangle2D.Float(0, 0, getWidth() - 1, getHeight() - 1, 20, 20);
        g2d.setColor(field.getBackground());
        g2d.fill(shape);
        g2d.setColor(Color.BLACK);
        g2d.draw(shape);
        g2d.dispose();
    }

}

这当然只是一堆示例,您需要自己清理它并为值提供自定义;)

【讨论】:

    【解决方案2】:

    我不确定您所说的“曲线”是什么意思。但这里有一种调整大小和设置字体的方法:

        addressBar.setFont(new Font("TimesRoman", Font.ITALIC, 30));
    

    【讨论】:

    • 不要搞砸组件的首选大小,尤其是文本组件,这真的会搞砸 UI。让字体更改处理它
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2016-04-25
    • 2021-03-21
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    相关资源
    最近更新 更多