Java Swing – 将矩形拖到 JPanel 上的有效方法?

Java Swing - Valid approach for dragging rectangles onto a JPanel?

我有一些绘制矩形的代码。它用于在 JPanel 上绘制矩形,以标记小部件的边界。这里首先是代码,然后我将解释我的问题cq。问题。

首先,我有一个扩展 JPanel.

的类 (WidgetDrawingPanel)

public WidgetDrawingPanel(int width, int height) {

  /*To make things visible at least*/

  widgets.add(new Widget(10,10,100,100, WidgetType.TextField));

  widgets.add(new Widget(50,50,100,200, WidgetType.TextField));

  this.width = width;

  this.height = height;

  this.setBackground(Color.BLUE);

  addListener(); //adds both MouseMotionListener and MouseListener

}

private void addListener() {

  this.addMouseMotionListener(new MouseMotionListener() {

    @Override

    public void mouseDragged(MouseEvent arg0) {

      ch.currentX = arg0.getX();

      ch.currentY = arg0.getY();

      System.out.println("dragging" + ch.currentX +","+ch.currentY);

      WidgetDrawingPanel.this.repaint();

    }

  });

  this.addMouseListener(new MouseListener() {

    @Override

    public void mouseReleased(MouseEvent event) {

      ch.endX = event.getX();

      ch.endY = event.getY();

      try {

        checkCoords();

      } catch (OutsidePanelException e) {

        e.printStackTrace();

        JOptionPane.showMessageDialog(null,"drawn Outside Panel");

      }

    }



    @Override

    public void mousePressed(MouseEvent event) {

      ch = new CoordinateHolder(event.getX(), event.getY());

    }

  });

}
@Override

public void paintComponent(Graphics g) {

  super.paintComponent(g);

  System.out.println("Paint");

  g.setColor(Color.BLUE);

  g.fillRect(0, 0, width, height); //making the whole panel blue

  g.setColor(Color.RED);

  Graphics2D g2 = (Graphics2D)g;

  g2.setStroke(new BasicStroke(3));

  for (Widget w : widgets) { 

    g.drawRect(w.getX(), w.getY(), w.getW(), w.getH());

  }

  if (ch != null)

    g.drawRect(ch.startX, ch.startY, ch.currentX - ch.startX, ch.currentY - ch.startY);

}

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;



import javax.swing.*;



@SuppressWarnings("serial")

public class DrawingPanel extends JPanel {

 private static final int PREF_W = 600;

 private static final int PREF_H = 400;

 private static final Color DRAWING_COLOR = new Color(255, 100, 200);

 private static final Color FINAL_DRAWING_COLOR = Color.red;



 private BufferedImage backgroundImg;

 private Point startPt = null;

 private Point endPt = null;

 private Point currentPt = null;



 public DrawingPanel() {

   backgroundImg = new BufferedImage(PREF_W, PREF_H,

      BufferedImage.TYPE_INT_ARGB);

   Graphics g = backgroundImg.getGraphics();

   g.setColor(Color.blue);

   g.fillRect(0, 0, PREF_W, PREF_H);

   g.dispose();



   MyMouseAdapter myMouseAdapter = new MyMouseAdapter();

   addMouseMotionListener(myMouseAdapter);

   addMouseListener(myMouseAdapter);

 }



 @Override

 protected void paintComponent(Graphics g) {

   super.paintComponent(g);

   if (backgroundImg != null) {

    g.drawImage(backgroundImg, 0, 0, this);

   }



   if (startPt != null && currentPt != null) {

    g.setColor(DRAWING_COLOR);

    int x = Math.min(startPt.x, currentPt.x);

    int y = Math.min(startPt.y, currentPt.y);

    int width = Math.abs(startPt.x - currentPt.x);

    int height = Math.abs(startPt.y - currentPt.y);

    g.drawRect(x, y, width, height);

   }

 }



 @Override

 public Dimension getPreferredSize() {

   return new Dimension(PREF_W, PREF_H);

 }



 public void drawToBackground() {

   Graphics g = backgroundImg.getGraphics();

   g.setColor(FINAL_DRAWING_COLOR);

   int x = Math.min(startPt.x, endPt.x);

   int y = Math.min(startPt.y, endPt.y);

   int width = Math.abs(startPt.x - endPt.x);

   int height = Math.abs(startPt.y - endPt.y);

   g.drawRect(x, y, width, height);

   g.dispose();



   startPt = null;

   repaint();

 }



 private class MyMouseAdapter extends MouseAdapter {

   @Override

   public void mouseDragged(MouseEvent mEvt) {

    currentPt = mEvt.getPoint();

    DrawingPanel.this.repaint();

   }



   @Override

   public void mouseReleased(MouseEvent mEvt) {

    endPt = mEvt.getPoint();

    currentPt = null;

    drawToBackground();

   }



   @Override

   public void mousePressed(MouseEvent mEvt) {

    startPt = mEvt.getPoint();

   }

 }



 private static void createAndShowGui() {

   DrawingPanel mainPanel = new DrawingPanel();



   JFrame frame = new JFrame("Drawing Panel");

   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   frame.getContentPane().add(mainPanel);

   frame.pack();

   frame.setLocationByPlatform(true);

   frame.setVisible(true);

 }



 public static void main(String[] args) {

   SwingUtilities.invokeLater(new Runnable() {

    public void run() {

      createAndShowGui();

    }

   });

 }

}

下面你会看到我引用了很多 ch。这是一个 CoordinateHolder,它保存了我的鼠标移动的起始坐标和当前坐标。

public WidgetDrawingPanel(int width, int height) {

  /*To make things visible at least*/

  widgets.add(new Widget(10,10,100,100, WidgetType.TextField));

  widgets.add(new Widget(50,50,100,200, WidgetType.TextField));

  this.width = width;

  this.height = height;

  this.setBackground(Color.BLUE);

  addListener(); //adds both MouseMotionListener and MouseListener

}

private void addListener() {

  this.addMouseMotionListener(new MouseMotionListener() {

    @Override

    public void mouseDragged(MouseEvent arg0) {

      ch.currentX = arg0.getX();

      ch.currentY = arg0.getY();

      System.out.println("dragging" + ch.currentX +","+ch.currentY);

      WidgetDrawingPanel.this.repaint();

    }

  });

  this.addMouseListener(new MouseListener() {

    @Override

    public void mouseReleased(MouseEvent event) {

      ch.endX = event.getX();

      ch.endY = event.getY();

      try {

        checkCoords();

      } catch (OutsidePanelException e) {

        e.printStackTrace();

        JOptionPane.showMessageDialog(null,"drawn Outside Panel");

      }

    }



    @Override

    public void mousePressed(MouseEvent event) {

      ch = new CoordinateHolder(event.getX(), event.getY());

    }

  });

}
@Override

public void paintComponent(Graphics g) {

  super.paintComponent(g);

  System.out.println("Paint");

  g.setColor(Color.BLUE);

  g.fillRect(0, 0, width, height); //making the whole panel blue

  g.setColor(Color.RED);

  Graphics2D g2 = (Graphics2D)g;

  g2.setStroke(new BasicStroke(3));

  for (Widget w : widgets) { 

    g.drawRect(w.getX(), w.getY(), w.getW(), w.getH());

  }

  if (ch != null)

    g.drawRect(ch.startX, ch.startY, ch.currentX - ch.startX, ch.currentY - ch.startY);

}

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;



import javax.swing.*;



@SuppressWarnings("serial")

public class DrawingPanel extends JPanel {

 private static final int PREF_W = 600;

 private static final int PREF_H = 400;

 private static final Color DRAWING_COLOR = new Color(255, 100, 200);

 private static final Color FINAL_DRAWING_COLOR = Color.red;



 private BufferedImage backgroundImg;

 private Point startPt = null;

 private Point endPt = null;

 private Point currentPt = null;



 public DrawingPanel() {

   backgroundImg = new BufferedImage(PREF_W, PREF_H,

      BufferedImage.TYPE_INT_ARGB);

   Graphics g = backgroundImg.getGraphics();

   g.setColor(Color.blue);

   g.fillRect(0, 0, PREF_W, PREF_H);

   g.dispose();



   MyMouseAdapter myMouseAdapter = new MyMouseAdapter();

   addMouseMotionListener(myMouseAdapter);

   addMouseListener(myMouseAdapter);

 }



 @Override

 protected void paintComponent(Graphics g) {

   super.paintComponent(g);

   if (backgroundImg != null) {

    g.drawImage(backgroundImg, 0, 0, this);

   }



   if (startPt != null && currentPt != null) {

    g.setColor(DRAWING_COLOR);

    int x = Math.min(startPt.x, currentPt.x);

    int y = Math.min(startPt.y, currentPt.y);

    int width = Math.abs(startPt.x - currentPt.x);

    int height = Math.abs(startPt.y - currentPt.y);

    g.drawRect(x, y, width, height);

   }

 }



 @Override

 public Dimension getPreferredSize() {

   return new Dimension(PREF_W, PREF_H);

 }



 public void drawToBackground() {

   Graphics g = backgroundImg.getGraphics();

   g.setColor(FINAL_DRAWING_COLOR);

   int x = Math.min(startPt.x, endPt.x);

   int y = Math.min(startPt.y, endPt.y);

   int width = Math.abs(startPt.x - endPt.x);

   int height = Math.abs(startPt.y - endPt.y);

   g.drawRect(x, y, width, height);

   g.dispose();



   startPt = null;

   repaint();

 }



 private class MyMouseAdapter extends MouseAdapter {

   @Override

   public void mouseDragged(MouseEvent mEvt) {

    currentPt = mEvt.getPoint();

    DrawingPanel.this.repaint();

   }



   @Override

   public void mouseReleased(MouseEvent mEvt) {

    endPt = mEvt.getPoint();

    currentPt = null;

    drawToBackground();

   }



   @Override

   public void mousePressed(MouseEvent mEvt) {

    startPt = mEvt.getPoint();

   }

 }



 private static void createAndShowGui() {

   DrawingPanel mainPanel = new DrawingPanel();



   JFrame frame = new JFrame("Drawing Panel");

   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   frame.getContentPane().add(mainPanel);

   frame.pack();

   frame.setLocationByPlatform(true);

   frame.setVisible(true);

 }



 public static void main(String[] args) {

   SwingUtilities.invokeLater(new Runnable() {

    public void run() {

      createAndShowGui();

    }

   });

 }

}

,最后是 paintComponent(Grapics) 方法。有循环通过Widgets,实际上只是已经绘制了Rects(x,y,w,h 属性),但是其中的信息多一点,这在应用程序的绘图部分没有用。每次释放鼠标时,CoordinateHolder 都会转换为 Widget,并添加到 Widgets.

public WidgetDrawingPanel(int width, int height) {

  /*To make things visible at least*/

  widgets.add(new Widget(10,10,100,100, WidgetType.TextField));

  widgets.add(new Widget(50,50,100,200, WidgetType.TextField));

  this.width = width;

  this.height = height;

  this.setBackground(Color.BLUE);

  addListener(); //adds both MouseMotionListener and MouseListener

}

private void addListener() {

  this.addMouseMotionListener(new MouseMotionListener() {

    @Override

    public void mouseDragged(MouseEvent arg0) {

      ch.currentX = arg0.getX();

      ch.currentY = arg0.getY();

      System.out.println("dragging" + ch.currentX +","+ch.currentY);

      WidgetDrawingPanel.this.repaint();

    }

  });

  this.addMouseListener(new MouseListener() {

    @Override

    public void mouseReleased(MouseEvent event) {

      ch.endX = event.getX();

      ch.endY = event.getY();

      try {

        checkCoords();

      } catch (OutsidePanelException e) {

        e.printStackTrace();

        JOptionPane.showMessageDialog(null,"drawn Outside Panel");

      }

    }



    @Override

    public void mousePressed(MouseEvent event) {

      ch = new CoordinateHolder(event.getX(), event.getY());

    }

  });

}
@Override

public void paintComponent(Graphics g) {

  super.paintComponent(g);

  System.out.println("Paint");

  g.setColor(Color.BLUE);

  g.fillRect(0, 0, width, height); //making the whole panel blue

  g.setColor(Color.RED);

  Graphics2D g2 = (Graphics2D)g;

  g2.setStroke(new BasicStroke(3));

  for (Widget w : widgets) { 

    g.drawRect(w.getX(), w.getY(), w.getW(), w.getH());

  }

  if (ch != null)

    g.drawRect(ch.startX, ch.startY, ch.currentX - ch.startX, ch.currentY - ch.startY);

}

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;



import javax.swing.*;



@SuppressWarnings("serial")

public class DrawingPanel extends JPanel {

 private static final int PREF_W = 600;

 private static final int PREF_H = 400;

 private static final Color DRAWING_COLOR = new Color(255, 100, 200);

 private static final Color FINAL_DRAWING_COLOR = Color.red;



 private BufferedImage backgroundImg;

 private Point startPt = null;

 private Point endPt = null;

 private Point currentPt = null;



 public DrawingPanel() {

   backgroundImg = new BufferedImage(PREF_W, PREF_H,

      BufferedImage.TYPE_INT_ARGB);

   Graphics g = backgroundImg.getGraphics();

   g.setColor(Color.blue);

   g.fillRect(0, 0, PREF_W, PREF_H);

   g.dispose();



   MyMouseAdapter myMouseAdapter = new MyMouseAdapter();

   addMouseMotionListener(myMouseAdapter);

   addMouseListener(myMouseAdapter);

 }



 @Override

 protected void paintComponent(Graphics g) {

   super.paintComponent(g);

   if (backgroundImg != null) {

    g.drawImage(backgroundImg, 0, 0, this);

   }



   if (startPt != null && currentPt != null) {

    g.setColor(DRAWING_COLOR);

    int x = Math.min(startPt.x, currentPt.x);

    int y = Math.min(startPt.y, currentPt.y);

    int width = Math.abs(startPt.x - currentPt.x);

    int height = Math.abs(startPt.y - currentPt.y);

    g.drawRect(x, y, width, height);

   }

 }



 @Override

 public Dimension getPreferredSize() {

   return new Dimension(PREF_W, PREF_H);

 }



 public void drawToBackground() {

   Graphics g = backgroundImg.getGraphics();

   g.setColor(FINAL_DRAWING_COLOR);

   int x = Math.min(startPt.x, endPt.x);

   int y = Math.min(startPt.y, endPt.y);

   int width = Math.abs(startPt.x - endPt.x);

   int height = Math.abs(startPt.y - endPt.y);

   g.drawRect(x, y, width, height);

   g.dispose();



   startPt = null;

   repaint();

 }



 private class MyMouseAdapter extends MouseAdapter {

   @Override

   public void mouseDragged(MouseEvent mEvt) {

    currentPt = mEvt.getPoint();

    DrawingPanel.this.repaint();

   }



   @Override

   public void mouseReleased(MouseEvent mEvt) {

    endPt = mEvt.getPoint();

    currentPt = null;

    drawToBackground();

   }



   @Override

   public void mousePressed(MouseEvent mEvt) {

    startPt = mEvt.getPoint();

   }

 }



 private static void createAndShowGui() {

   DrawingPanel mainPanel = new DrawingPanel();



   JFrame frame = new JFrame("Drawing Panel");

   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   frame.getContentPane().add(mainPanel);

   frame.pack();

   frame.setLocationByPlatform(true);

   frame.setVisible(true);

 }



 public static void main(String[] args) {

   SwingUtilities.invokeLater(new Runnable() {

    public void run() {

      createAndShowGui();

    }

   });

 }

}

这段代码可以工作,但我怀疑这是非常低效和低效的,因为上面的代码会在鼠标拖动时不断刷新 JPanel,也就是说,每 10 毫秒一次?我想它很快就会变慢,尤其是当用户创建大量矩形时(它们也不断重绘,如 painComponent(Graphics) 所示)。

问题cq。问题

有没有更好、更省资源的方法,用户可以流畅地拖动矩形?

我在 Java 的 JFrame 上阅读了这个 Drag rectangle 的答案,但该答案的作者似乎和我一样。但是再一次,这太低效了,对吧?或者计算机是否应该能够轻松地不断重绘组件,这实际上是一种有效的方法吗?


要显示大量不变的背景形状,请将它们绘制到 BufferedImage 中,然后在 paintComponent(...) 方法中显示该 BufferedImage。因此,在绘制形状时,将其绘制在 paintComponent(...) 中,但一旦绘制完成,可能在 mouseRelease 上,然后在后台 BufferedImage.

中绘制它

请注意,最会减慢您当前绘图代码的可能是您的调试 SOP 语句,但我假设这些将从完成的代码中删除。

例如:

public WidgetDrawingPanel(int width, int height) {

  /*To make things visible at least*/

  widgets.add(new Widget(10,10,100,100, WidgetType.TextField));

  widgets.add(new Widget(50,50,100,200, WidgetType.TextField));

  this.width = width;

  this.height = height;

  this.setBackground(Color.BLUE);

  addListener(); //adds both MouseMotionListener and MouseListener

}

private void addListener() {

  this.addMouseMotionListener(new MouseMotionListener() {

    @Override

    public void mouseDragged(MouseEvent arg0) {

      ch.currentX = arg0.getX();

      ch.currentY = arg0.getY();

      System.out.println("dragging" + ch.currentX +","+ch.currentY);

      WidgetDrawingPanel.this.repaint();

    }

  });

  this.addMouseListener(new MouseListener() {

    @Override

    public void mouseReleased(MouseEvent event) {

      ch.endX = event.getX();

      ch.endY = event.getY();

      try {

        checkCoords();

      } catch (OutsidePanelException e) {

        e.printStackTrace();

        JOptionPane.showMessageDialog(null,"drawn Outside Panel");

      }

    }



    @Override

    public void mousePressed(MouseEvent event) {

      ch = new CoordinateHolder(event.getX(), event.getY());

    }

  });

}
@Override

public void paintComponent(Graphics g) {

  super.paintComponent(g);

  System.out.println("Paint");

  g.setColor(Color.BLUE);

  g.fillRect(0, 0, width, height); //making the whole panel blue

  g.setColor(Color.RED);

  Graphics2D g2 = (Graphics2D)g;

  g2.setStroke(new BasicStroke(3));

  for (Widget w : widgets) { 

    g.drawRect(w.getX(), w.getY(), w.getW(), w.getH());

  }

  if (ch != null)

    g.drawRect(ch.startX, ch.startY, ch.currentX - ch.startX, ch.currentY - ch.startY);

}

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;



import javax.swing.*;



@SuppressWarnings("serial")

public class DrawingPanel extends JPanel {

 private static final int PREF_W = 600;

 private static final int PREF_H = 400;

 private static final Color DRAWING_COLOR = new Color(255, 100, 200);

 private static final Color FINAL_DRAWING_COLOR = Color.red;



 private BufferedImage backgroundImg;

 private Point startPt = null;

 private Point endPt = null;

 private Point currentPt = null;



 public DrawingPanel() {

   backgroundImg = new BufferedImage(PREF_W, PREF_H,

      BufferedImage.TYPE_INT_ARGB);

   Graphics g = backgroundImg.getGraphics();

   g.setColor(Color.blue);

   g.fillRect(0, 0, PREF_W, PREF_H);

   g.dispose();



   MyMouseAdapter myMouseAdapter = new MyMouseAdapter();

   addMouseMotionListener(myMouseAdapter);

   addMouseListener(myMouseAdapter);

 }



 @Override

 protected void paintComponent(Graphics g) {

   super.paintComponent(g);

   if (backgroundImg != null) {

    g.drawImage(backgroundImg, 0, 0, this);

   }



   if (startPt != null && currentPt != null) {

    g.setColor(DRAWING_COLOR);

    int x = Math.min(startPt.x, currentPt.x);

    int y = Math.min(startPt.y, currentPt.y);

    int width = Math.abs(startPt.x - currentPt.x);

    int height = Math.abs(startPt.y - currentPt.y);

    g.drawRect(x, y, width, height);

   }

 }



 @Override

 public Dimension getPreferredSize() {

   return new Dimension(PREF_W, PREF_H);

 }



 public void drawToBackground() {

   Graphics g = backgroundImg.getGraphics();

   g.setColor(FINAL_DRAWING_COLOR);

   int x = Math.min(startPt.x, endPt.x);

   int y = Math.min(startPt.y, endPt.y);

   int width = Math.abs(startPt.x - endPt.x);

   int height = Math.abs(startPt.y - endPt.y);

   g.drawRect(x, y, width, height);

   g.dispose();



   startPt = null;

   repaint();

 }



 private class MyMouseAdapter extends MouseAdapter {

   @Override

   public void mouseDragged(MouseEvent mEvt) {

    currentPt = mEvt.getPoint();

    DrawingPanel.this.repaint();

   }



   @Override

   public void mouseReleased(MouseEvent mEvt) {

    endPt = mEvt.getPoint();

    currentPt = null;

    drawToBackground();

   }



   @Override

   public void mousePressed(MouseEvent mEvt) {

    startPt = mEvt.getPoint();

   }

 }



 private static void createAndShowGui() {

   DrawingPanel mainPanel = new DrawingPanel();



   JFrame frame = new JFrame("Drawing Panel");

   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   frame.getContentPane().add(mainPanel);

   frame.pack();

   frame.setLocationByPlatform(true);

   frame.setVisible(true);

 }



 public static void main(String[] args) {

   SwingUtilities.invokeLater(new Runnable() {

    public void run() {

      createAndShowGui();

    }

   });

 }

}

相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161