有没有办法让我的地址栏的JTextField更大更曲线

我正在制作一个浏览器只是为了练习我的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页面展示一样,我还需要学习什么来使这项工作。

几乎所有这些都归结为操纵边界,但这可能不会产生你的结果,例如……

大片场地

 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))); 

这会产生类似……

在此处输入图像描述不透明

但是我不喜欢这样,因为如果仔细观察,边框外的区域仍然会被绘制……你可以让边框填满这个区域,但我喜欢能够为组件提供透明的function,所以相反你可以假装它……

假边框透明的领域

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

 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(); } } 

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

我不确定你的意思是“曲线”。 但这是一种resize并设置字体的方法:

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