天道酬勤,学无止境

如何在Java Swing TextArea中更改突出显示颜色? 并且,更改与突出显示位置相对应的文本的开头(How to change highlighting color in Java Swing TextArea? And also, change the beginning of text corresponding to the highlighting location)

问题

问题1:通过使用defaulthighlighter,我可以使聚焦线变为蓝色。 现在,我想将其更改为其他颜色。 有人知道如何更改此参数吗? - - 解决了

问题2:pos是我要突出显示的子字符串的开始索引。 我使用setCaretPosition(pos); 更新显示内容。 但是它总是出现在窗口的底部。 我想把它放在顶部。 谁能告诉我该如何处理?

我使用一个演示来展示我的问题:

import java.awt.Color;
import java.net.MalformedURLException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;

public class Test {
    public static void main(final String[] args) throws MalformedURLException {
        SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            try {
                init();
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });
}

private static void init() throws BadLocationException {
    JFrame frame = new JFrame();
    final JTextArea textArea = new JTextArea();
    JScrollPane pane = new JScrollPane(textArea);
    textArea.setText("Something. Something else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Samething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sbmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Scmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sdmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Semething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sfmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sgmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n");
    textArea.setSelectionColor(Color.RED);
    frame.add(pane);
    frame.setSize(300, 120);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    String turnToString2 = "Sdmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla";
    int pos2 = textArea.getText().indexOf(turnToString2);
    textArea.getHighlighter().addHighlight(pos2,
            pos2 + turnToString2.length(),
            new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));
    textArea.setCaretPosition(pos2);

结果是: 在此处输入图片说明

我希望它位于屏幕的右上方,但是在此代码中,它显示在滚动窗格的底部。 谁能知道如何改变这一点? 谢谢。

回答1

您可以实现此操作,尽管不是直接实现,因为您必须保存对添加到上述行中的Highlight的引用,因此您必须遍历所有Highlight以删除所需的内容,请看一下程序可能会帮助您实现自己的愿望:

最新编辑:新代码,已删除的一些错误和类似已添加的与设置购物车位置有关的功能

import java.awt.*;
import java.awt.event.*;
import java.util.Map;
import java.util.HashMap;
import javax.swing.*;
import javax.swing.text.*;

public class TextHighlight
{
    private JTextArea tarea;
    private JComboBox cbox;
    private JTextField lineField;
    private String[] colourNames = {"RED", "ORANGE", "CYAN"};

    private Highlighter.HighlightPainter redPainter;
    private Highlighter.HighlightPainter orangePainter;
    private Highlighter.HighlightPainter cyanPainter;   

    private int firstUpdateIndex;
    private int counter;

    private Map<Integer, Highlighter.Highlight> highlights = new HashMap<Integer, Highlighter.Highlight>();

    public TextHighlight()
    {
        redPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
        orangePainter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE);
        cyanPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN);

        firstUpdateIndex = -1;
        counter = 0;
    }

    private void createAndDisplayGUI()
    {
        final JFrame frame = new JFrame("Text HIGHLIGHT");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createEmptyBorder(5, 5, 5, 5), "Highlighter JTextArea"));

        tarea = new JTextArea(10, 10);
        JScrollPane scrollPane = new JScrollPane(tarea);
        contentPane.add(scrollPane);

        JButton remHighButton = new JButton("REMOVE HIGHLIGHT");
        remHighButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                String input = JOptionPane.showInputDialog(frame, "Please Enter Start Index : "
                                                        , "Highlighting Options : "
                                                        , JOptionPane.PLAIN_MESSAGE);

                if (input != null && (highlights.size() > 0))
                {               
                    int startIndex = Integer.parseInt(input.trim());
                    Highlighter highlighter = tarea.getHighlighter();
                    highlighter.removeHighlight(highlights.get(startIndex));
                    tarea.setCaretPosition(startIndex);
                    tarea.requestFocusInWindow();
                    highlights.remove(startIndex);
                }
            }
        });

        JButton button = new JButton("HIGHLIGHT TEXT");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                String text = null;
                text = tarea.getSelectedText();
                if (text != null && text.length() > 0)
                {
                    int startIndex = tarea.getText().indexOf(text);
                    int endIndex = startIndex + text.length();
                    Highlighter highlighter = tarea.getHighlighter();

                    int selection = JOptionPane.showConfirmDialog(
                                            frame, getOptionPanel(), "Highlight Colour : "
                                                , JOptionPane.OK_CANCEL_OPTION
                                                , JOptionPane.PLAIN_MESSAGE);

                    System.out.println("TEXT : " + text);
                    System.out.println("START INDEX : " + startIndex);
                    System.out.println("END INDEX : " + endIndex);

                    if (selection == JOptionPane.OK_OPTION)
                    {
                        String colour = (String) cbox.getSelectedItem();
                        try
                        {
                            if (colour == colourNames[0])
                            {
                                System.out.println("Colour Selected : " + colour);
                                highlighter.addHighlight(startIndex, endIndex, redPainter);
                            }
                            else if (colour == colourNames[1])
                            {
                                System.out.println("Colour Selected : " + colour);
                                highlighter.addHighlight(startIndex, endIndex, orangePainter);
                            }
                            else if (colour == colourNames[2])
                            {
                                System.out.println("Colour Selected : " + colour);
                                highlighter.addHighlight(startIndex, endIndex, cyanPainter);
                            }
                            Highlighter.Highlight[] highlightIndex = highlighter.getHighlights();
                            System.out.println("Lengh of Highlights used : " + highlightIndex.length);
                            highlights.put(startIndex, highlightIndex[highlightIndex.length - 1]);
                        }
                        catch(BadLocationException ble)
                        {
                            ble.printStackTrace();
                        }
                    }
                    else if (selection == JOptionPane.CANCEL_OPTION)
                    {
                        System.out.println("CANCEL BUTTON PRESSED.");
                    }
                    else if (selection == JOptionPane.CLOSED_OPTION)
                    {
                        System.out.println("JOPTIONPANE CLOSED DELIBERATELY.");
                    }                   
                }
            }
        });

        frame.add(remHighButton, BorderLayout.PAGE_START);
        frame.add(contentPane, BorderLayout.CENTER);
        frame.add(button, BorderLayout.PAGE_END);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel getOptionPanel()
    {
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createTitledBorder(
                        BorderFactory.createLineBorder(Color.DARK_GRAY, 2), "COLOUR SELECTION"));
        panel.setLayout(new GridLayout(0, 2, 5, 5));

        JLabel colourLabel = new JLabel("Select One Colour : ");
        cbox = new JComboBox(colourNames);

        panel.add(colourLabel);
        panel.add(cbox);

        return panel;
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TextHighlight().createAndDisplayGUI();
            }
        });
    }
}

输出 :

开始 : 开始时

重点第一线第一行 第二第二行

删除的要点后

用不同的颜色突出显示同一行再次亮点

与问题中的示例代码一致的最新编辑

import java.awt.*;
import java.net.MalformedURLException;

import javax.swing.*;
import javax.swing.text.*;

public class Test {
    public static void main(final String[] args) throws MalformedURLException {
        SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            try {
                init();
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });
}

private static void init() throws BadLocationException {
    JFrame frame = new JFrame();
    final JTextArea textArea = new JTextArea();
    JScrollPane pane = new JScrollPane(textArea);
    textArea.setText("Something. Something else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Samething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sbmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Scmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sdmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Semething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sfmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sgmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n");
    textArea.setSelectionColor(Color.RED);
    frame.add(pane);
    frame.setSize(300, 120);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    String turnToString2 = "Sdmething else.\nA second line\na third line"
            + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla";
    int pos2 = textArea.getText().indexOf(turnToString2);
    Rectangle startIndex = textArea.modelToView(pos2);
    textArea.getHighlighter().addHighlight(pos2,
            pos2 + turnToString2.length(),
            new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));    
    int y = startIndex.y + (pane.getHeight() - 10);
    System.out.println("Pane Height : " + pane.getHeight());
    System.out.println("X : " + startIndex.x);
    System.out.println("Y : " + y);
    System.out.println("Y (pos2) : " + startIndex.y);
    textArea.setCaretPosition(textArea.viewToModel(new Point(startIndex.x, y)));
    pane.scrollRectToVisible(new Rectangle(startIndex.x, y));
    }
}

这是输出:

右上

回答2

我认为在使用荧光笔的情况下无法为所有JTextComponents更改这些方法,但是仅可以更改前景

例如

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

public class TextAreaLineHightLight {

    public static void main(String[] args) throws Exception {
        UIManager.put("TextArea.selectionBackground", Color.yellow);
        UIManager.put("TextArea.selectionForeground", Color.red);

        String string = "Lorem ipsum eum putant gubergren evertitur in, "
                + "no assueverit vituperatoribus eum. Ea cibo offendit vim, est et vivendum qualisque prodesset. "
                + "Vis doctus expetenda contentiones an, no ius mazim epicuri expetendis, "
                + "saperet salutandi forensibus ne usu. Ex fugit alterum usu. "
                + "His ignota cotidieque in, augue erroribus eam no.";
        JTextArea textArea = new JTextArea(string);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        JScrollPane textAreaScroll = new JScrollPane(textArea);
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.add(textAreaScroll, BorderLayout.CENTER);
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        String term = "qualisque prodesset. "
                + "Vis doctus expetenda contentiones an, no ius mazim epicuri expetendis";
        int termOffset = string.indexOf(term);
        Rectangle view = textArea.modelToView(termOffset);
        int startOffset = textArea.viewToModel(new Point(0, view.y));
        //int rowH = textArea.
        int endOffset = textArea.viewToModel(new Point(textArea.getSize().width, view.y));
        textArea.getHighlighter().addHighlight(startOffset, endOffset, new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW));
    }
}

对于JTextPane具有相同的结果

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

public class TextPaneHighlighting extends JFrame {

    private static final long serialVersionUID = 1L;
    private Highlighter.HighlightPainter cyanPainter;
    private Highlighter.HighlightPainter redPainter;

    public TextPaneHighlighting() {
        UIManager.put("TextPane.selectionBackground", Color.yellow);
        UIManager.put("TextPane.selectionForeground", Color.red);
        JTextPane textPane = new JTextPane();
        textPane.setText("one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\n");
        JScrollPane scrollPane = new JScrollPane(textPane);
        getContentPane().add(scrollPane);//  Highlight some text
        cyanPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.cyan);
        redPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.red);
        try {
            textPane.getHighlighter().addHighlight(0, 3, DefaultHighlighter.DefaultPainter);
            textPane.getHighlighter().addHighlight(8, 14, cyanPainter);
            textPane.getHighlighter().addHighlight(19, 24, redPainter);
        } catch (BadLocationException ble) {
        }
    }

    public static void main(String[] args) {
        TextPaneHighlighting frame = new TextPaneHighlighting();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
回答3

要设置选择背景颜色,请使用setSelectionColor(如下所示,但未使用)。

我不太了解您在说什么,它总是出现在窗口底部。 我想将其放在顶部,但我猜(这里我可能错了),您的文本区域在滚动窗格中,并且通过突出显示该文本滚动到您选择的末尾,因此我建议设置插入符号的位置突出显示文本后。

这是我了解的示例。 让我知道这是否不是您想要的东西:

import java.awt.Color;
import java.net.MalformedURLException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;

public class Test {
    public static void main(final String[] args) throws MalformedURLException {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    init();
                } catch (BadLocationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });
    }

    private static void init() throws BadLocationException {
        JFrame frame = new JFrame();
        final JTextArea textArea = new JTextArea();
        JScrollPane pane = new JScrollPane(textArea);
        textArea.setText("Something. Something else.\nA second line\na third line"
                + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
                + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n");
        textArea.setSelectionColor(Color.RED);
        frame.add(pane);
        frame.setSize(300, 120);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        String turnToString = "Something else.\nA second line\na third line"
                + "Blabla\nBlabla\nBlabla\nBlabla\nBlabla";
        final int pos = textArea.getText().indexOf(turnToString);
        textArea.getHighlighter().addHighlight(pos,
                pos + turnToString.length(),
                new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));
        textArea.scrollRectToVisible(new Rectangle(0, 0, pane.getViewport().getWidth(), pane.getViewport().getHeight()));
            SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        textArea.setCaretPosition(pos);
                    }
            });
    }
}
回答4

解决方案2)使用modelToView获取第一个选定行的点。 然后使用Point使用scrollRectToVisible(注意:矩形的高度必须是您的视口高度)。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Swing渲染在JDK 1.8中似乎已损坏,在JDK 1.7中正确(Swing rendering appears broken in JDK 1.8, correct in JDK 1.7)
    问题 我已经安装了IntelliJ IDEA(13.1.1#IC-135.480)和JDK 1.8.0(x64),并使用GUI表单设计器生成了一些GUI。 然后我运行了代码,意识到有些事情还不对劲。 这是我的GUI的屏幕截图: 字体的呈现似乎不正常。 另外,当我将鼠标移到它上面时,Button会松开其Text。 因此,我安装了JDK 1.7.0_40(x64),重新编译了该项目,然后再次运行它。 当我使用JDK 1.7时,将出现以下表格: 渲染似乎正常,并且按钮也正常。 因此,我安装了最新的图形和芯片组驱动程序等等,但是问题仍然存在。 您是否曾经在Java Swing UI中遇到过此类问题? 您能帮我解决我的问题吗? 任何帮助将不胜感激。 更新: 我创建了一个只有1个JTextArea和1个JButton的小项目,并且我遇到了相同的渲染问题。 根据安德鲁·汤普森(Andrew Thompson)的观点,我更改了setSize(),并从EDT开始。 下面的例子: package at.maeh.java.client.simpleTextClient; import javax.swing.*; import java.awt.*; public class SimpleClient extends JFrame { private JPanel panel1; private
  • 如何以MS Word保留格式和语法高亮显示代码段?(How do you display code snippets in MS Word preserving format and syntax highlighting?)
    问题 有谁知道一种在Microsoft Word文档中显示可保留颜色和格式的代码的方法? 优选地,该方法也将是不引人注目的并且易于更新。 我试图将代码作为常规文本包含在内,这看起来很糟糕,并且在编辑常规文本时会遇到麻烦。 我还尝试将对象(写字板文档和文本框)插入文档,然后将代码放入这些对象中。 该代码看起来更好,并且在编辑其余文本时更容易避免。 但是,这些对象只能跨越一页,这在需要添加几页代码时使编辑成为一场噩梦。 最后,我知道有更好的编辑器/格式可以解决此问题,但是我仍然坚持使用MS word。 回答1 对我来说,这是在word中添加代码的最佳方法: 转到“ Insert选项卡的“ Text部分,单击“ object按钮(在右侧) 选择“ OpenDocument Text ,这将打开一个新的嵌入式Word文档从Visual Studio / Eclipse复制并粘贴您的代码到此嵌入式word页面中保存并关闭 结果看起来非常不错。 这是此方法的优点: 代码保持其原始布局和颜色代码与文档的其余部分分开,好像是图片还是图表拼写错误不会在代码中突出显示(这很酷!) 而且只需要几秒钟。 回答2 下载并安装Notepad ++并执行以下操作: 将您的代码粘贴到窗口中; 从语言菜单中选择编程语言; 选择要复制的文本; 右键单击并选择“插件命令” ->“复制带有语法突出显示的文本” ;
  • Java Swing按钮颜色[重复](Java Swing button colors [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Java GUI中设置按钮的背景色? (7个答案) 6年前关闭。 我正在使用NET Beans IDE在LINUX中开发应用程序。 我已经使用了Synthesisa软件包来生成新的外观。 到目前为止一切都很好。 现在,我的下一个阶段是在某些数据库状态更改时为按钮添加颜色。 例如: 在一家餐厅,我有2张桌子,当有8个人进餐时,由于人们无人值守,我将在我的软件中创建2张桌子,我希望这2张桌子的按钮呈绿色。 处理这些表中的任何一个表的订单时,已处理表的按钮颜色应更改为橙色。 处理中时,它应该是闪烁的颜色。 如何在Java中执行此操作? 我将负责数据库更新,我只想知道如何更改按钮的颜色并添加闪烁技术。 回答1 这是一个与刷新组件有关的问题和几个答案。 附录:您可以在文章如何使用按钮中了解更多信息。 特别是,您可以使用setForeground()更改按钮文本的颜色,但是相应的setBackground()在某些平台上不能很好地读取。 使用边框是一种选择。 彩色面板(如下所示)是另一个面板。 package overflow; import java.awt.Color; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent
  • 突出显示时如何更改UIButton的背景颜色?(How to change the background color of a UIButton while it's highlighted?)
    问题 在我的应用程序中的某个点上,我有一个突出显示的UIButton (例如,当用户将手指放在按钮上时),并且我需要在突出显示按钮时更改背景色(因此,当用户的手指仍在按钮上时) )。 我尝试了以下方法: _button.backgroundColor = [UIColor redColor]; 但这是行不通的。 颜色保持不变。 当按钮未突出显示且工作正常时,我尝试了同一段代码。 我还尝试在更改颜色后调用-setNeedsDisplay ,但没有任何效果。 如何强制按钮更改背景颜色? 回答1 您可以重写UIButton的setHighlighted方法。 物镜 - (void)setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted]; if (highlighted) { self.backgroundColor = UIColorFromRGB(0x387038); } else { self.backgroundColor = UIColorFromRGB(0x5bb75b); } } Swift 3.0和Swift 4.1 override open var isHighlighted: Bool { didSet { backgroundColor = isHighlighted
  • 更改JTable中一个单元格的背景颜色(Change background color of one cell in JTable [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: 更改Swing JTable单元格颜色 我已经开发了一个显示JTable的swing应用程序。 我希望当用户修改单元格值时,修改后的单元格更改颜色。 这是用户修改单元格时运行的代码: this.myTable.getColumnModel().getColumn(column).setCellRenderer(new StatusColumnCellRenderer()); 这是我的单元格渲染类的代码: public class StatusColumnCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { //Cells are by default rendered as a JLabel. JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); /
  • 如何在选择框下拉菜单中更改蓝色突出显示的颜色(How to change colour of blue highlight on select box dropdown)
    问题 如何更改此下拉菜单中的蓝色突出显示? 链接到选择框演示 如果可能的话,我想将突出显示颜色更改为灰色。 select { border: 0; color: #EEE; background: transparent; font-size: 20px; font-weight: bold; padding: 2px 10px; width: 378px; *width: 350px; *background: #58B14C; -webkit-appearance: none; } #mainselection { overflow: hidden; width: 350px; -moz-border-radius: 9px 9px 9px 9px; -webkit-border-radius: 9px 9px 9px 9px; border-radius: 9px 9px 9px 9px; box-shadow: 1px 1px 11px #330033; background: url("http://www.danielneumann.com/wp-content/uploads/2011/01/arrow.gif") no-repeat scroll 319px 5px #58B14C; } <div id="mainselection"> <select>
  • 可以即时进行语法高亮显示的Textarea吗?(Textarea that can do syntax highlighting on the fly?)
    问题 由于易于维护,我在CMS内存储了许多HTML块。 它们由<textarea>表示。 是否有人知道某种JavaScript Widget可以在textarea或类似textarea内对HTML进行语法高亮显示,同时仍保留纯文本编辑器(没有WYSIWYG或高级功能)? 回答1 在常规textarea无法实现所需的呈现控制级别。 如果可以,请尝试CodeMirror或Ace或Monaco(用于MS VSCode)。 来自重复的线程-强制性的Wikipedia链接:基于JavaScript的源代码编辑器的比较 回答2 这是我对程序员类似问题(在线代码编辑器)的回答: 首先,您可以看一下这篇文章: Wikipedia ―基于JavaScript的源代码编辑器的比较。 有关更多信息,以下一些工具似乎可以满足您的要求: EditArea ―演示为Yii扩展的FileEditor ―( Apache软件许可,BSD,LGPL ) 这是EditArea,一个免费的Javascript源代码编辑器。 它允许编写带有行号,标签支持,搜索和替换(使用regexp)以及实时语法突出显示(可自定义)的格式正确的源代码。 CodePress ― Joomla演示! CodePress插件―( LGPL )―在Chrome中不起作用,并且看来开发已经停止。 CodePress是基于Web的源代码编辑器
  • 删除Chrome自动完成功能的输入背景色?(Removing input background colour for Chrome autocomplete?)
    问题 在我正在处理的表单上,Chrome浏览器会自动填写电子邮件和密码字段。 很好,但是Chrome将背景颜色更改为浅黄色。 我正在研究的设计是在深色背景上使用浅色文本,因此这确实弄乱了表单的外观-我有明显的黄色框和几乎看不见的白色文本。 聚焦后,场将恢复正常。 是否可以停止Chrome更改这些字段的颜色? 回答1 你可以改变输入框风格以及内部文本样式input框: 在这里您可以使用任何颜色,例如white , #DDD , rgba(102, 163, 177, 0.45) #DDD rgba(102, 163, 177, 0.45) 。 但是transparent在这里是行不通的。 /* Change the white to any color */ input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active { -webkit-box-shadow: 0 0 0 30px white inset !important; } 此外,您可以使用它来更改文本颜色: /*Change text in autofill textbox*/ input:-webkit-autofill { -webkit-text
  • 加载和显示大文本文件(Loading and displaying large text files)
    问题 在Swing应用程序中,有时我需要支持对缓慢加载的大型,面向行的文本文件的只读访问:日志,转储,跟踪等。对于少量数据,可以使用合适的Document和JTextComponent ,如此处所示。 我了解浏览大量数据的人为限制,但是有问题的东西似乎总是放在最大的文件中。 对于10-100兆字节,百万行范围内的大量文本,是否有任何实用的替代方法? 回答1 我将把问题分开。 第一个是模型-文件建立速度 第二个是文档渲染-建立表示文档的视图树。 问题是您是否需要字体效果(如关键字着色)? 我将从文档构建部分开始。 恕我直言,即使是大文件,通过EditorKit.read()读取文件也应该很快。 我将使用PainDocument来检查纯模型是否为您的应用程序足够快地构建。 如果是,则可以使用Document作为模型。 如果未实现您自己的Document接口,则因为AbstractDocument具有大量用于更新处理的方法(例如writeLock)。 当文档加载速度足够快时,我们必须解决文档渲染问题。 默认情况下,javax.swing.text中使用的视图非常灵活。 它们被设计为要扩展的基类-因此有很多我们不需要的代码。 例如测量。 对于我将使用等宽字体的功能,我们不需要换行,因此对视图widht的测量很快=最长行char计数* char widht。 高度也是字符高度*行数。 因此
  • 如何在按下鼠标时更改JButton颜色?(How to change a JButton color on mouse pressed?)
    问题 我想根据鼠标事件(鼠标进入,退出,按下等)设置自定义颜色。 为此,我编写了下面的代码。 一切都很好,但鼠标按下事件除外,后者不执行任何操作。 只有当我像这样UIManager.put("Button.select", Color.red);覆盖UIManager的颜色时,它才起作用UIManager.put("Button.select", Color.red); 。 UIManager问题在于,对于我所有的按钮,它都会更改。 谁能告诉我我可能做错了什么,或者完成我正在尝试做的最好的方法是什么? 我的代码: final JButton btnSave = new JButton("Save"); btnSave.setForeground(new Color(0, 135, 200).brighter()); btnSave.setHorizontalTextPosition(SwingConstants.CENTER); btnSave.setBorder(null); btnSave.setBackground(new Color(3, 59, 90)); btnSave.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent e) { btnSave
  • 如何在Java中获取窗口外部的鼠标单击坐标(how to obtain mouse click coordinates outside my window in Java)
    问题 我需要使用Swing实现一个类,该类可以在用户单击屏幕上的任何位置时获取鼠标坐标。 如果我想在自己的窗口中获取鼠标坐标,则可以使用MouseListener ,但是即使用户在程序外部单击,我也希望它能够工作。 我希望我的班级表现得像KColorChooser:用户单击下拉按钮,他可以单击屏幕上的任意位置以获取该斑点的颜色。 但是我不知道使用纯Java是否可行。 回答1 尽管有可能,但可能会受到限制: 为焦点事件添加一个AWTEventListener。 只要您的应用在单击按钮之前就具有焦点,您就会收到焦点丢失事件。 然后查询指针位置。 限制是,当然,您的应用程序会失去焦点。 因此,根据最终要实现的目标,这可能没有用。 如果您不想失去焦点,则必须暂时截取整个屏幕的屏幕截图,并将其显示在屏幕填充窗口中,该窗口像往常一样侦听鼠标单击。 第一种方法的证明: import java.awt.AWTEvent; import java.awt.MouseInfo; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import javax.swing.JFrame; public class Application1 { public static void main(String[] args) {
  • 如何将图像添加到JPanel?(How to add an image to a JPanel?)
    问题 我有一个JPanel,我想向其中添加即时生成的JPEG和PNG图像。 到目前为止,我在Swing教程中看到的所有示例,特别是在Swing示例中,都使用ImageIcon 。 我将这些图像生成为字节数组,它们通常比示例中使用的通用图标大,尺寸为640x480。 使用ImageIcon类在JPanel中显示该大小的图像时是否存在任何(性能或其他)问题? 通常的做法是什么? 如何在不使用ImageIcon类的情况下将图像添加到JPanel? 编辑:对教程和API的更仔细的检查表明,您不能将ImageIcon直接添加到JPanel。 而是通过将图像设置为JLabel的图标来实现相同的效果。 只是感觉不对... 回答1 这是我的操作方法(还有更多有关如何加载图像的信息): import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JPanel; public class ImagePanel
  • 如何更改JSplitPane的颜色(How to change the color of a JSplitPane)
    问题 我在阅读有关挥杆的书时编写了一个小程序,该程序在两个标签之间创建了一个JSplitPane。 问题在于,几乎看不到JSplitPane(至少在我的操作系统-MAC OS Lion中),并且在其上设置某些属性(如前景色)似乎不起作用。 这是代码: //Demonstrate a simple JSplitPane package swingexample4_6; import javax.swing.*; import java.awt.*; public class SplitPaneDemo { //constructor public SplitPaneDemo() { //Create a new JFrame container. //Use the default border layout JFrame jfrm = new JFrame("Split Pane Demo"); //Give the frame an initial size jfrm.setSize(380, 150); //Terminate the program when the user closes the application jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //--Make two labels to
  • 如何比较两个富文本框内容并突出显示已更改的字符?(How to compare two rich text box contents and highlight the characters that are changed?)
    问题 我用于阅读2个richtextbox内容的代码如下: richTextBox1.Text = File.ReadAllText(tfsVersionFilePath); richTextBox2.Text = File.ReadAllText(dbVersionFilePath); 现在,我需要比较两个富文本框的内容,并突出显示两个富文本框中已更改的字符。 目的是通过c#应用程序获得差异并突出显示as in TFS (比较文件)中的字符。 谢谢。 编辑: int length = (richTextBox1.Text.Length > richTextBox2.Text.Length) ? richTextBox1.Text.Length : richTextBox2.Text.Length; for (int i = 0; i < length; i++) { if (richTextBox1.Text[i] != richTextBox2.Text[i]) { /* and then start your highlight selection here, this is where some difference between the two rich text boxes begins */ richTextBox1.Select(i, 1)
  • Android ListView所选项目保持突出显示(Android ListView selected item stay highlighted)
    问题 我有一个带有两个ListView的XML ,一个带有一个由选择查询( lv_cli )填充的客户端列表,另一个带有选择的客户端的详细信息( lv_cli_det )的lv_cli_det 。 我想在lv_cli选择客户端,而lv_cli_det显示详细信息。 XML: <ListView android:id="@+id/cli_lista" android:layout_width="512dp" android:layout_height="wrap_content" android:fadeScrollbars="false" > </ListView> <ListView android:id="@+id/cli_lista_det" android:layout_width="512dp" android:layout_height="wrap_content" android:layout_toRightOf="@+id/cli_lista" android:fadeScrollbars="false" > </ListView> Java的: Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null); final ListView t = (ListView
  • 如何将MouseListener添加到Java Swing画布上的项目(How to add MouseListener to item on Java Swing Canvas)
    问题 我想制作一个Java面板来创建用户单击的对象。 由于我的实际应用程序使用MVC方法,因此我也希望这些对象能够在更改模型时重新绘制自身,并提供菜单以更改其属性。 我认为控制它们的x和y位置的最佳方法是采用基于canvas的方法, JPanel从paintComponent方法对这些对象调用draw方法。 但是,这只会在画布上绘制形状,而不会添加对象本身,从而失去了控制对象属性的所有能力。 如果有人能告诉我我想做的最好方法,我将不胜感激。 我创建了一些示例代码,如下所示。 单击时,我希望圆圈更改颜色,这是使用MouseListener实现的(在这个小示例中,它基本上表示更改模型属性)。 另外,我只是想确保放大/缩小仍可与任何示例代码/建议一起使用,因此我添加了按钮来放大和缩小对象,以进行快速测试。 import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; import java.awt.geom.Ellipse2D; public class Main { public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { @Override public void
  • MVC模式和Swing(The MVC pattern and Swing)
    问题 我发现在“真实的Swing生活”中最难掌握的设计模式之一是MVC模式。 我浏览了该站点上的很多文章,讨论了该模式,但是我仍然不了解如何在我的Java Swing应用程序中利用该模式。 假设我有一个JFrame,其中包含一个表,几个文本字段和一些按钮。 我可能会使用TableModel将JTable与基础数据模型“桥接”。 但是,负责清除字段,验证字段,锁定字段以及按钮操作的所有函数通常都直接在JFrame中。 但是,这不是将模式的Controller和View混合了吗? 据我所知,当查看JTable(和模型)时,我设法“正确地”实现了MVC模式,但是当我整体查看整个JFrame时,事情就变得混乱了。 我真的很想听听其他人对此的看法。 当您需要使用MVC模式向用户显示表格,几个字段和一些按钮时,如何处理? 回答1 我极力推荐给MVC的书籍是Freeman和Freeman撰写的“ Head First Design Patterns”。 他们对MVC有高度全面的解释。 简要总结您就是用户-您与视图进行交互。 视图是您进入模型的窗口。 当您对视图执行某项操作(例如单击“播放”按钮)时,该视图会告诉控制器您做了什么。 处理该任务是控制器的工作。 控制器要求模型更改其状态。 控制器执行您的动作并解释它们。 如果单击按钮,那么控制器的工作就是弄清楚这意味着什么
  • 更改ListView上所选项目的背景颜色(Change background color of selected item on a ListView)
    问题 我想知道如何更改listView上所选项目的背景颜色。 我只想更改用户单击的特定项目,这意味着如果用户单击另一个项目,它将被突出显示。 好吧,因为我希望它尽可能保持简单并使用默认的android listview,所以我改用以下代码: record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { try{ for (int ctr=0;ctr<=record_items.length;ctr++){ if(i==ctr){ record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN); }else{ record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE); } } } catch (Exception e){ e.printStackTrace(); } Log.v("Selected item",record_list.getItemAtPosition(i)); } }); 好的,这是可行的
  • 益智游戏中的JPanel无法更新(JPanel in puzzle game not updating)
    问题 我有一个简单的益智游戏。 有一个由16个图块组成的图像(随机放置)。 图像存储在一个数组中,并且在启动游戏时将它们添加到主JPanel中。 游戏以这种方式工作:每个图像都有属性“位置”和“数字”。 “位置”是网格上的当前位置(正确与否),“数字”是图像的所需位置。 用户单击图像时,将检查其“位置”和“编号”属性。 如果它们匹配,则什么也不会发生。 如果不是,游戏会检查内存中当前是否有任何图像。 如果没有,则存储该图像的“位置”和“编号”。 如果内存中有一些图像,则将当前单击的图像的“位置”与存储的图像的“编号”进行检查。 当他们匹配时-他们的位置被交换。 这部分工作正常。 但是现在,我正在JPanel上使用更新的图像调用addComponent方法,并且什么都没有发生。 难道不应该将新图像添加到JPanel中以替换旧图像吗? 套餐奖金; import javax.swing.*; import java.util.Random; import java.awt.event.*; import java.awt.*; class Puzzle extends JPanel implements ActionListener { private int selected_nr=-1; private int selected_pl=-1; private boolean
  • 在文本突出显示事件上?(On Text Highlight Event?)
    问题 我很好奇是否有人知道一旦用户完成选择网页上的文本后如何触发函数运行? 我希望用户能够选择文本,并且在短暂的延迟后(或立即,此时无所谓),文本附近会出现一个叠加按钮,用户可以单击该按钮,然后我返回并运行我的更多基于选择的代码。 这是用于Firefox扩展。 我能想到的一个类似示例就像在IE中一样,您可以在其中选择文本,然后显示“ Web加速器”。 我99%的确定我知道我将如何实际叠加按钮,并获取所选文本的位置,但是我不知道如何检查是否有选中的内容,而无需进行某种无限循环,似乎是一个可怕的主意。 编辑: //In my overlay.js with the rest of my sidebar code isTextSelected: function () { var myText = cqsearch.getSelectedText(); var sidebar = document.getElementById("sidebar"); var sidebarDoc = sidebar.contentDocument || document; var curHighlightedDiv = sidebarDoc.getElementById("testDiv"); curHighlightedDiv.innerHTML = "Current text selection:"